Автоматический тип в дереве свойств Boost

В настоящее время у меня есть этот код:

if(!variables["width"].defaulted())
{
    configTree.put(treeNames["width"], variables["width"].as<int>());
}

if(!variables["height"].defaulted())
{
    configTree.put(treeNames["height"], variables["height"].as<int>());
}

if(!variables["fullscreen"].defaulted())
{
    configTree.put(treeNames["fullscreen"], variables["height"].as<int>());
}

Я пытаюсь просто это. Единственное, что меня останавливает, - это то, что в будущем у меня также будут переменные std::string, что означает, что простой цикл по всем значениям и использование as() не сработает.

Я рассмотрел попытку использовать boost::any для as<>(), но это не работает (множество шаблонных ошибок). Я также подумал о том, чтобы иметь кортеж со значением, указывающим, какой тип он будет, затем переключаться через него и вызывать соответствующий как <>(), но это кажется излишним.

Есть ли способ просто это?

1 ответ

template<class T> void xput(const char* name) {
    if(!variables[name].defaulted())
        configTree.put(treeNames[name], variables[name].as<T>());
}

xput<int>("width");
xput<int>("height");
xput<int>("fullscreen");
xput<std::string>("future-option");

Если вы хотите добиться полиморфизма во время выполнения, преобразуйте указанную выше функцию в функтор и назначьте ее для boost::function.

Другие вопросы по тегам