С++ ООП дизайн для хранилища семплов
Приветствую коллеги,
Дорабатываю имеющуюся C++ обертку для порт аудио.
Не могу понять как мне организовать хранение семплов, простых числовых значений типа int разной длины или float. Вопрос по ООП дизайну.
К сожалению имеющая кодовая база построена так разные типы семплов хранятся в разных типах шаблонных классов
MyBuffer<INT_16>
MyBuffer<FLOAT_32>
Хранилище типизировано и везде в коде который использует класс MyBuffer стоят switch/if по типу контейнера. Что мне кажется не очень правильно, при добавлении нового типа семплов везде придется ставить дополнительные if блоки.
В каждом таком хранилище будет только один тип значений. Наверное будет правильно сделать MyBuffer не шаблонным а обычным классом. Я могу использовать простой union для хранения разных типов данных в одном объекте и хранить информацию о том какой в целом тип содержит мой контейнер. ( Есть и std::variant из С++17 но мне кажется тут можно обойтись и простым union) Т.е внутри моего класса будет
std::vector<myUnion> dataStorage;
Также можно хранить данные в сыром виде (массив unsigned char) и тоже хранить информацию о том какой тип данных хранится реально внутри контейнера.
Или же можно создать базовый тип Sample и наследников семплы разного формата Sample16, Sample32Float например. И в таком случае хранить коллекцию указателей на этот базовйый тип
std::vector<*Sample>
Хотелось бы еще и данные как то в одном виде отдавать из этого контейнера и избежать всех if/switch по типу.
И тут к сожалению все рассмотренные подходы упираются в одинаковую проблему. метод не сможет вернуть разные типы данных.
type? GetSample(int ch, int frame)
либо надо иметь разные методы, что привежет к тем же if/switch в коде который использует класс MyBuffer()
int GetIntSample(int ch, int frame);
float GetFloatSample(int ch, int frame);
либо просто отдавать сырые данные в массиве char
void GetSample(int ch, int frame, char* outBuffer);
Может быть действиельно обойтись простым хранением unsigned char, и отдавать эти данные unisigned char для всех? Например при отправке этих данных по сети они все в любом случае в массив байт преобразуются.
Никак не могу сообращить как лучше сделать, идея явно где рядом. Уверен что подобная задача встречалась раныее, и может даже в увебниках о проектированию разобрана, но к сожалению никак не могу найти оптимальное решение.
Буду благодарен за идеи! Спасибо!