5

設定ファイルからいくつかの値をリロードしたいと思います。po::storeに値が存在する場合、値は変更されないことを私は知っていvariables_mapます。値がすでに存在している場合でも、値を置き換える代替手段はありますか?

リロードしようとしている値をから削除しようとしましたvariables_mapが、po::storeとにかく新しい値を追加しません(古い値にもアクセスできませんが)。

4

2 に答える 2

7

P3trus のソリューションには、ダウンキャストが含まれます。これは、返す aをvariables_mapオーバーロードするため必要です( constは再割り当てを防ぎます)。std::map::operator[]const variable_value &

ただし、C++11 ではstd::map::at()オーバーロードされていないため、次のことが可能です。

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

必要な場所に直接。

于 2014-11-24T10:45:33.283 に答える
5

問題は、変数マップが最終的なオプションを記憶していることです。ソースを見ると、次のエントリがあります。

/** 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;
于 2011-12-10T13:22:47.993 に答える