![](/img/trans.png)
[英]boost::Program_options How to support hash character in a value?
[英]boost::program_options how to reload a value
我想从配置文件中重新加载一些值。 我知道po::store
如果存在于variables_map
则不会更改值。 是否存在替代值的替代方法,即使它们已经存在?
我尝试删除我将要从variables_map
重新加载的variables_map
,但po::store
无论如何都不会添加新值(即使旧的也无法访问)。
P3trus的解决方案涉及向下倾斜。 这是必要的,因为variables_map
重载了std::map::operator[]
返回一个const variable_value &
( const阻止重新分配)。
但是在C ++ 11中我们有std::map::at()
没有重载,所以可以这样做:
vm.at(option).value() = val;
直接在哪里需要。
问题是变量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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.