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

#c #boost #boost-propertytree

#c #boost #boost-propertytree

Вопрос:

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

 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<>(), но это не работает (множество ошибок шаблона). Я также рассматривал возможность создания кортежа со значением, указывающим, какой это будет тип, затем переключение через него и вызов соответствующего as<>() , но это кажется излишним.

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

Комментарии:

1. Чего вы хотите достичь? (Это легко упростить, если вы не хотите ничего достигать. Просто удалите все это.)

2. Я хочу просмотреть значение каждой переменной и вставить его в дерево конфигурации, строку или int.

Ответ №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 .