前述の@Rostと同様に、ビジターパターンが良い選択です。 POでそれを使用するには、オプションが渡された場合、通知者がboost::variant
値の項目を記入するような方法で通知機能を使用する必要があります。セットは別々に保管する必要があります。その後、あなたのセットを繰り返し処理して、boost::apply_visitor
を使ってアクション(つまり、印刷)を自動的に処理することができます。訪問者のための
は、実は、私はビジターと一般的なアプローチの使用は、より幅広い作らboost::static_visitor<>
から継承します。
説明を保持するclass MyOption
を作成しました。値はboost::variant
、暗黙的、デフォルトなどのその他のオプションは作成しました。テンプレートを使用してPOのように(boost::po::options_add()
を参照)、タイプMyOption
のオブジェクトのベクトルを入力します。渡した瞬間に、またはdouble()
のboosts::varian
の初期化では、値のタイプとデフォルトの暗黙のような他のものを入力します。
boost::po::options_description
コンテナを埋めるのにVisitorパターンを使用しました。boost::po
は、入力コマンドラインを解析するために独自の構造が必要です。塗りつぶし中に、各オプションの通知者を設定します。それが渡される場合、boost::po
は自動的に元のオブジェクトのMyOption
を埋め込みます。
po::parse
とpo::notify
を実行する必要があります。その後、boost :: variantを内部に保持しているので、すでにVisitorパターンでstd::vector<MyOption*>
と入力して使用することができます。
このすべてについては何が良いですか?std::vector<MyOption*>
を入力するときに、コードにオプションを1回だけ書き込む必要があります。
PS。この方法を使用している場合、notifyerに値のないオプションを設定する問題に直面する場合は、解決策を得るためにこのトピックを参照してください。boost-program-options: notifier for options with no value
PS2。コードの例:
std::vector<MyOptionDef> options;
OptionsEasyAdd(options)
("opt1", double(), "description1")
("opt2", std::string(), "description2")
...
;
po::options_descripton boost_descriptions;
AddDescriptionAndNotifyerForBoostVisitor add_decr_visitor(boost_descriptions);
// here all notifiers will be set automatically for correct work with each options' value type
for_each(options.begin(), options.end(), boost::apply_visitor(add_descr_visitor));
は、リンクやRTTIについての考えをありがとう:
使用法(物事の束をおそらくコンパイルエラーがコードにありますが、私は私のコードベースからそれをリッピングし、非typedefed) 。タイプが増えれば管理しなければならないすべてのサポートされているタイプの構造を構築できないようにしたいと考えていましたが、これは不可能なようです。 基本的に、私は型に渡したいと思っていました - もし彼らが 'operator <<'をサポートしていればすべてうまくいきます。そうでなければコンパイルは失敗します。 – shiin