@Rostが前述したように、ここではビジターパターンが適切な選択です。POで使用するには、オプションが渡された場合に通知機能が値のセットのエントリを埋めるように、オプションに通知機能を使用する必要がありboost::variantます。セットは個別に保管する必要があります。その後、セットを反復処理し、を使用してアクションを自動的に処理(つまり印刷)することができますboost::apply_visitor。
訪問者の場合、boost::static_visitor<>
実際、私はビジターと一般的なアプローチの使用をより広くしました。
値や、暗黙的、デフォルトなどの他のオプションのclass MyOption説明を保持するを作成しました。テンプレートを介してPOがオプション(を参照)に対して行うのと同じ方法boost::variantで、タイプのオブジェクトのベクトルを入力します。渡した瞬間、またはtの初期化では、値のタイプや、デフォルト、暗黙的なその他のものを入力します。MyOptionboost::po::options_add()std::string()double()boosts::varian
その後、入力コマンドラインを解析するための独自の構造が必要なため、Visitorパターンを使用してboost::po::options_descriptionコンテナを埋めました。boost::po塗りつぶし中に、オプションごとに通知機能を設定しました。それが渡さboost::poれると、元のオブジェクトのが自動的に塗りつぶされますMyOption。
次に、とを実行する必要がpo::parseありpo::notifyます。std::vector<MyOption*>その後、 boost :: Variantを内部に保持しているため、Visitorパターンを介してすでに入力されているものを使用できるようになります。
これらすべての良い点は、を入力するときに、コードにオプション型を1回だけ記述する必要があることですstd::vector<MyOption*>。
PS。このアプローチを使用すると、値のないオプションの通知機能を設定する際に問題が発生する場合は、次のトピックを参照して解決策を入手してください。boost -program-options:値のないオプションの通知機能
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));