設定ファイルからいくつかの値を再読み込みしたいと思います。私は、variables_map
に存在する場合、po::store
は値を変更しないことを知っています。すでに存在していても値を置き換える代替手段はありますか?boost :: program_options値を再ロードする方法
variables_map
からリロードしようとしている値を削除しようとしましたが、古い値にアクセスすることはできませんが、po::store
には新しい値が追加されません。
設定ファイルからいくつかの値を再読み込みしたいと思います。私は、variables_map
に存在する場合、po::store
は値を変更しないことを知っています。すでに存在していても値を置き換える代替手段はありますか?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は、名前空間の別名である:それが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;
P3trusの解決策には、ダウンキャストが含まれます。 variables_map
がstd::map::operator[]
にconst variable_value &
(constの再割り当てを防止する)をオーバーロードするため、これが必要です。
しかしC++ 11で我々は、オーバーロードされていないstd::map::at()
を持っているので、行うことが可能です。必要とされている直接
vm.at(option).value() = val;
を。
いくつかの変更を加えれば、上では構文的にチェックアウトしていないため、関数はうまくいきました。 テンプレート void modify_variable_map(std :: map &vm、const std :: string&opt、const T&val){vm [opt] .value()= boost ::任意(val); } –