目前我有这个代码:
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 for as<>(),但这不起作用(大量的模板错误)。我还考虑过使用一个带有值的元组来指定它的类型,然后切换并调用适当的as<>(),但这似乎有点小题大做。
有办法简化这个吗?
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。