我想从配置文件中重新加载一些值。我知道po::store
如果它们存在于variables_map
. 即使值已经存在,是否有替代方法可以替换它们?
我尝试删除即将从 中重新加载的值variables_map
,但po::store
无论如何都没有添加新值(即使旧值也无法访问)。
我想从配置文件中重新加载一些值。我知道po::store
如果它们存在于variables_map
. 即使值已经存在,是否有替代方法可以替换它们?
我尝试删除即将从 中重新加载的值variables_map
,但po::store
无论如何都没有添加新值(即使旧值也无法访问)。
P3trus 的解决方案涉及向下转型。这是必要的,因为variables_map
重载std::map::operator[]
返回的 a const variable_value &
(const防止重新分配)。
但是在 C++11 中我们std::map::at()
没有重载,所以可以这样做:
vm.at(option).value() = val;
直接在需要的地方。
问题是变量映射会记住哪些选项是最终的。如果您查看源代码,您会发现以下条目。
/** 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;