И это всё МОЁ

Приветствую коллеги,


Дорабатываю имеющуюся 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 для всех?
Например при отправке этих данных по сети они все в любом случае в массив байт преобразуются.


Никак не могу сообращить как лучше сделать, идея явно где рядом.
Уверен что подобная задача встречалась раныее, и может даже в увебниках о проектированию разобрана, но к сожалению никак не могу найти оптимальное решение.


Буду благодарен за идеи!
Спасибо!









 , , ,