設定ファイルからいくつかの値をリロードしたいと思います。po::store
に値が存在する場合、値は変更されないことを私は知っていvariables_map
ます。値がすでに存在している場合でも、値を置き換える代替手段はありますか?
リロードしようとしている値をから削除しようとしましたvariables_map
が、po::store
とにかく新しい値を追加しません(古い値にもアクセスできませんが)。
設定ファイルからいくつかの値をリロードしたいと思います。po::store
に値が存在する場合、値は変更されないことを私は知っていvariables_map
ます。値がすでに存在している場合でも、値を置き換える代替手段はありますか?
リロードしようとしている値をから削除しようとしましたvariables_map
が、po::store
とにかく新しい値を追加しません(古い値にもアクセスできませんが)。
P3trus のソリューションには、ダウンキャストが含まれます。これは、返す aをvariables_map
オーバーロードするため必要です( constは再割り当てを防ぎます)。std::map::operator[]
const variable_value &
ただし、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;