boost :: program_options如何重新加载值

时间:2011-12-03 22:10:21

标签: c++ boost boost-program-options

我想从配置文件中重新加载一些值。我知道po::store如果variables_map中存在值,则variables_map不会更改值。是否存在替代值的替代方法,即使它们已经存在?

我尝试删除即将从po::store重新加载的值,但{{1}}无论如何都不会添加新值(即使旧版也无法访问)。

2 个答案:

答案 0 :(得分:5)

问题是变量map会记住哪些选项是最终的。 如果查看源代码,可以找到以下条目。

/** Names of option with 'final' values -- which should not
    be changed by subsequence assignments. */
std::set<std::string> m_final;

它是variables_map的私有成员变量。

我想最简单的方法是使用新的variables_map并替换旧的。如果您需要一些旧值,或者只是想替换其中一些值,请编写自己的存储功能。你基本上用po :: store创建一个临时的variables_map,然后以你需要的方式更新你的variables_map。

variables_map基本上是一个std :: map,因此您可以以相同的方式访问其内容。它存储了一个po :: variable_value,一种围绕boost :: any对象的包装器。如果你只想替换一个值,你可以使用类似的东西

template<class T>
void replace(  std::map<std::string, po::variable_value>& vm, const std::string& opt, const T& val)
{
  vm[option].value() = boost::any(val);
}

注意:po是名称空间别名。

namespace po = boost::program_options;

答案 1 :(得分:5)

P3trus的解决方案涉及向下倾斜。这是必要的,因为variables_map重载std::map::operator[]会导致const variable_value & const 阻止重新分配)。

但是在C ++ 11中,我们std::map::at()没有重载,所以可以这样做:

vm.at(option).value() = val;

直接在哪里需要。