22

私は最近、文書化されていない の機能を発見しましたboost::program_options。つまり、次のように、同じプレフィックスを持つオプションのグループを宣言できる特別なワイルドカードとして「*」を受け入れることです。

configOptions.add_options()
    ("item_*", value<int>(), "items");

この宣言は期待どおりに機能しitem_1item_3、 などを認識しましたが、不明なオプションは拒否されました。さて、問題は、次のように、オプション キーとその値をマップに入力するカスタム検証関数をどのように作成できるかということです。

map<string, int> itemsMap;
options_description items("items options");
    items.add_options()
        ("item_*",value<map<string, int>>(&itemsMap)->multitoken(), "items")
    ;

私の質問は、validate() 関数内から検証されているオプションのキーを取得するにはどうすればよいですか?

template <typename T> void validate(boost::any& v, const std::vector<std::string>& values, map<string, T> *, int)
4

1 に答える 1

1

すべての引数を反復処理して、正しいプレフィックスを持つものを特定するか、カスタム パーサーを作成する必要があります。両方のオプションの手順は、以下のリンクの正しい答えにあります。

boost::program_options: 固定トークンと可変トークンを持つパラメーター?

反復オプションの方が理解しやすい (実装して読む) ように見えるかもしれませんが、カスタム パーサーも優れているようです (私は使用したことがありませんが)。

于 2013-06-12T13:46:42.727 に答える