В нашем приложении у нас есть объект, который получает атрибуты во время выполнения. Например, чтобы добавить объект с плавающей точкой:
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 *
и все дополнительное внимание, которое требуется для правильной очистки. Есть ли какой-нибудь лучший способ хранить произвольные типы в объекте во время выполнения, доступный через карту строк, и все же выиграть от автоматической очистки через деструктор?