Автоматический тип в дереве свойств 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.