2011-12-03 43 views
3

我想從配置文件重新加載一些值。我知道po::store不會更改存在於variables_map中的值。是否有替代品可以取代價值,即使它們已經存在?boost :: program_options如何重新加載值

我嘗試刪除從variables_map重新加載的值,但po::store不會添加新值(即使舊的無法訪問)。

回答

4

問題是變量映射會記住哪些選項是最終的。 如果你看看源代碼,你會發現以下條目。

/** 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; 
+0

經過一些修改,您的函數運行良好,因爲上面沒有檢查語法。template void modify_variable_map(std :: map &vm,const std :: string&opt,const T&val){vm [opt] .value()= boost ::任何(VAL); } –

3

P3trus的解決方案涉及沮喪。這是必要的,因爲variables_map過載std::map::operator[]返回const variable_value &常數防止重新分配)。

然而,在C++ 11我們有std::map::at()未超載,所以它是可以做到:

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

直接需要的地方。