Используя C ++, я пытаюсь создать универсальный контейнерный класс для обработки нескольких типов данных. Это распространенная проблема с различными решениями, но я не нашел ничего настолько ... интуитивно понятного, как я привык к таким языкам, как Python или даже VB / VBA ...
Итак, вот мой сценарий:
Я построил класс DataContainer на основе boost :: any, который я использую для хранения нескольких типов данных нескольких элементов. Я использую карту, объявленную как:
std::map<std::string, DataContainer* (or DataContainerBase*)>
где DataContainer - это класс, который инкапсулирует объект типа:
std::list<boost::any>
вместе с удобными функциями для управления / доступа к списку.
Однако, в конце концов, я все еще вынужден выполнять преобразования типов вне контейнера данных.
Например, если бы я должен был сохранить список значений int на карте, доступ к ним потребовал бы:
int value = boost::any_cast<int>(map["myValue"]->get());
Я бы предпочел, чтобы код повышения полностью содержался в структуре контейнера данных, поэтому мне нужен только тип:
int value = map["myValue"]->get();
или, в худшем случае:
int value = map["myValue"]->get<int>();
Конечно, я мог бы перечислить свои типы данных и сделать что-то вроде:
int value = map["myValue"]->get( TYPE_INT );
или написать специфичные для типа функции get ():
getInt(), getString(), getBool() ...
Проблема с двумя последними опциями заключается в том, что они несколько негибки, что требует от меня явного объявления каждого типа, который я хочу сохранить в контейнере. Решение any_cast (которое я реализовал и работает), я думаю, хорошо, просто ... не элегантно? Я не знаю. Кажется, мне не нужно использовать внутреннюю механику также и снаружи.
На мой взгляд, передача значения без объявления типа значения в вызове функции-члену DataContainer потребует решения void * (что нежелательно по очевидным причинам), а использование вызова get () потребует (насколько я могу судить) функция-член "виртуального шаблона", определенная на уровне базового класса, что, конечно, недопустимо.
Как таковое, у меня есть работоспособное решение, и действительно, мое использование в этом случае достаточно ограничено, чтобы большинство любых решений работало хорошо. Но мне интересно, может быть, есть более гибкий способ управления универсальным контейнером данных различного типа, чем этот.