我想從配置文件重新加載一些值。我知道po::store
不會更改存在於variables_map
中的值。是否有替代品可以取代價值,即使它們已經存在?boost :: program_options如何重新加載值
我嘗試刪除從variables_map
重新加載的值,但po::store
不會添加新值(即使舊的無法訪問)。
我想從配置文件重新加載一些值。我知道po::store
不會更改存在於variables_map
中的值。是否有替代品可以取代價值,即使它們已經存在?boost :: program_options如何重新加載值
我嘗試刪除從variables_map
重新加載的值,但po::store
不會添加新值(即使舊的無法訪問)。
問題是變量映射會記住哪些選項是最終的。 如果你看看源代碼,你會發現以下條目。
/** 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 ::任何object.If你只是想取代你可以使用類似的東西
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);
}
注單值的包裝:寶是一個命名空間別名。
namespace po = boost::program_options;
P3trus的解決方案涉及沮喪。這是必要的,因爲variables_map
過載std::map::operator[]
返回const variable_value &
(常數防止重新分配)。
然而,在C++ 11我們有std::map::at()
未超載,所以它是可以做到:
vm.at(option).value() = val;
直接需要的地方。
經過一些修改,您的函數運行良好,因爲上面沒有檢查語法。template void modify_variable_map(std :: map &vm,const std :: string&opt,const T&val){vm [opt] .value()= boost ::任何(VAL); } –