2011-12-03 8 views
3

設定ファイルからいくつかの値を再読み込みしたいと思います。私は、variables_mapに存在する場合、po::storeは値を変更しないことを知っています。すでに存在していても値を置き換える代替手段はありますか?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は、名前空間の別名である:それがpo :: VARIABLE_VALUE、任意の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

いくつかの変更を加えれば、上では構文的にチェックアウトしていないため、関数はうまくいきました。 テンプレート void modify_variable_map(std :: map &vm、const std :: string&opt、const T&val){vm [opt] .value()= boost ::任意(val); } –

3

P3trusの解決策には、ダウンキャストが含まれます。 variables_mapstd::map::operator[]const variable_value &constの再割り当てを防止する)をオーバーロードするため、これが必要です。

しかしC++ 11で我々は、オーバーロードされていないstd::map::at()を持っているので、行うことが可能です。必要とされている直接

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

を。

関連する問題