Добавление произвольных типов к объекту во время выполнения - PullRequest
2 голосов
/ 13 июня 2011

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

my_object->f("volume") = 1.0f;

Получение тома работает так же:

cout << my_object->f("volume") << endl;

Внутренне это представлено строкой соответствующего типа. Каждый тип имеет свои собственные методы доступа и карту. Это выглядит так:

map<string, float> my_floats;
map<string, int> my_ints;
map<string, void *> my_void_pointers;

Ох, страшно void *. Иногда нам нужно добавить классы или функции к объекту. Вместо того, чтобы иметь отдельную карту для каждого мыслимого типа, мы остановились на карте void *. Проблема в том, что мы имеем дело с уборкой. В настоящее время мы храним список каждого типа этих «висящих» объектов, на которые указывает void *, и при необходимости вызываем функцию очистки в этих отдельных списках.

Мне не нравится использовать void * и все дополнительное внимание, которое требуется для правильной очистки. Есть ли какой-нибудь лучший способ хранить произвольные типы в объекте во время выполнения, доступный через карту строк, и все же выиграть от автоматической очистки через деструктор?

Ответы [ 3 ]

5 голосов
/ 13 июня 2011

Вы избалованы выбором - boost :: any или просто храните все как std :: string, и то и другое сразу приходит на ум.

2 голосов
/ 13 июня 2011

Этот пост, кажется, является хорошим ответом на ваш вопрос.

Хранение списка произвольных объектов в C ++

1 голос
/ 13 июня 2011

Вместо того, чтобы хранить карту с таким количеством значений, было бы лучше использовать boost :: Вариант. В конце концов, судя по вашему интерфейсу, для меня было бы недопустимо присваивать как int, так и float одной и той же строке.

std::map<std::string, boost::variant<float, int, std::string, ...>>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...