#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 .