Управление объектами MultiType под одной структурой

Я пробую среду управления данными в C ++, которая периодически (когда вызывается Manager :: checkout ()) сохраняет текущее состояние. Это будет основой системы, позволяющей перезапускать приложение после системной ошибки.

Идея состоит в том, чтобы иметь одноэлементный класс с именем Manager, который бы содержал в себе все переменные, пользователь мог бы просто создать новую управляемую переменную, выполнив

int& i = Manager::get().make<int>("variable_id");
double& e = Manager::get().make<double>("other_variable_id");

Моя проблема заключается в том, как управлять переменной с точки зрения менеджера.

Моя первая идея состояла в том, чтобы создать класс объекта, основанный на типе переменной, который будет содержать переменную, а также методы для сериализации / управления переменной.

Тем не менее, если бы у меня было много таких

Object<char>, Object<double>, Object<std::vector<int>>

Все отлито

Object<void>

И хранить в

std::map<std::string, Object<void>>

Я бы не знал, как взаимодействовать с этими объектами (поскольку менеджер не знал бы базовый тип). Я не могу сохранить тип как элемент объекта (к сожалению, типы не являются объектами в C ++), и я не хочу использовать перечисления, чтобы не налагать ограничения на то, что может и не может быть сохранено, кроме только части сериализации.

Есть идеи, как я мог это сделать?

0

Решение

Помимо того факта, что «диспетчер одноэлементных данных» звучит как ужасная идея («менеджер данных», вероятно, является худшим названием для класса, который я мог бы Когда-либо представьте себе), тип стираемого типа в значительной степени зависит от одного важного условия:

Знаю ли я все типы заранее?

  • Если вы знаете, используйте variant (Boost имеет реализацию) и предлагаемый шаблон посетителей.

  • Если вы этого не сделаете, посмотрите на any,

В любом случае, основная идея состоит в том, чтобы аннотировать стертый указатель с помощью значение обозначает его тип времени выполнения. C ++ делает это (и мы называем это RTTI), но в вашем случае, вероятно, лучше сделать это вручную.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector