許容される入力変数のセットをパラメータに設定する方法はありますか?たとえば、パラメータ "arg"は "cat"や "dog"のような文字列値のみを持つことができます。ブーストプログラムのオプションが許可されている入力値のセット
答えて
私はBoost.Program_optionsのドキュメントを読み飛ばしましたが、それができるかどうかはわかりません。ライブラリが主にの構文解析を検証していないという印象を受けます。あなたはcustom validatorで何かをすることができるかもしれませんが、悪い入力があったときに例外がスローされます(これはあなたが望むより重大なエラーかもしれません)。私はその機能が、あなたが実際に文字列を持っているかどうかを確かめるために、それが "猫"か "犬"ではないと考えています。
私は考えることができる最も簡単な解決策は、--arg
がcat
またはdog
に設定したことを確認するために、後で独自のコードを追加し、ライブラリは通常通り、コマンドラインを解析できるようにすることです。その後、エラーを出力して終了するか、適切なデフォルトに戻すか、好きなものに戻すことができます。
custom validator機能を使用できます。オプションに固有の型を定義し、その型の関数validate
をオーバーロードします。
struct catdog {
catdog(std::string const& val):
value(val)
{ }
std::string value;
};
void validate(boost::any& v,
std::vector<std::string> const& values,
catdog* /* target_type */,
int)
{
using namespace boost::program_options;
// Make sure no previous assignment to 'v' was made.
validators::check_first_occurrence(v);
// Extract the first string from 'values'. If there is more than
// one string, it's an error, and exception will be thrown.
std::string const& s = validators::get_single_string(values);
if (s == "cat" || s == "dog") {
v = boost::any(catdog(s));
} else {
throw validation_error(validation_error::invalid_option_value);
}
}
そのコードからスローされた例外は、他の無効なオプション値のためにスローされた例外と違いはありませんので、あなたはすでにそれらを処理するために準備しなければなりません。
使用代わりに、あなたのオプションを定義するときだけstring
の特別なオプションの種類は:
desc.add_options()
("help", "produce help message")
("arg", po::value<catdog>(), "set animal type")
;
非常に簡単なアプローチは、通常の文字列として「動物」を使用し、必要に応じてテストしてスローすることを通知した後です。
if (vm.count("animal") && (!(animal == "cat" || animal == "dog")))
throw po::validation_error(po::validation_error::invalid_option_value, "animal");
これはMichaelが示唆したものではありませんか? –
@RobKennedy「マイケルはあなたができることがあります」と言ったのに対し、ジョルゲンは「ここでできることは何ですか? –
- 1. jQueryトークン入力でカスタム入力が許可されていません
- 2. ChromeでAjaxの許可ドメインが許可されていない
- 3. 入力:[type = checkbox]に:before擬似要素が許可されていますか?
- 4. UITableViewCellでの入力を許可する
- 5. Autosys許可オプション
- 6. 入力値のエコー値が一度入力されたとき
- 7. CSSで数値操作が許可されていますか?
- 8. selectタグでオプションをクリックして値を入力すると、入力が作成されます
- 9. Gmailサーバーの許可方法が許可されていないメールサーバー
- 10. Access 2007のプロジェクトフォームでの問題入力/更新データが許可されていない
- 11. オプション405 :(メソッドが許可されていない)サーバーがアクセス制御許可メソッドを送信するかどうかに関係なく、オプション、取得、ヘッド、POST
- 12. Regexバリデーターが入力として空を許可する
- 13. 入力時にフォールトを許可する
- 14. MonoTouch.Dialog - 入力されたテキストの編集を許可しないEntryElement
- 15. テキスト入力に数値入力だけを許可し、オプションの最初の文字としてハイフンを使用する
- 16. USBホストモード - 許可されているが記憶されていないデバイスアクセス許可
- 17. Cではbooleanの戻り値の型が許可されていますか?
- 18. ColdFusion Builder RDSクエリービューアの挿入が許可されていますか?
- 19. 入力フォーマットとしてSQL SERVERを許可するCOM入力プラグインを探す
- 20. フラスコエラー:「メソッド許可されない方法が要求されたURLに許可されていません」
- 21. エラー:エラー:整数型が許可されていません(値 '10'の 'layout_height')
- 22. AutoCompleteTextViewは推奨されたオプションのみを許可します
- 23. XMLスキーマ:別のオプションのタグが提供されている場合にのみ、タグを許可します。
- 24. Webview html入力フォームがキーボードを表示/許可していない
- 25. &oacute; xmlファイルでは許可されていませんが、.netリソースファイルで許可されていますか?
- 26. iPadとiPhoneのテストが許可されていない
- 27. CodeIgniterの許可されていない主な文字が
- 28. データベーステーブルに変数値が入力されていません
- 29. Curl POSTフォームリクエストで入力値が隠されています
- 30. テキストフィールド入力のオプション
この例では、[公式ドキュメント](http://www.boost.org/doc/libs/1_55_0/doc/html/program_options/howto.html#idp163429032)で提供1と非常によく似ています。しかし、抽出演算子関数を実装する必要があります 'std :: istream&operator >>(std :: istream&in、catdog&cd)' '{' 'return in.value;' '} ' ' – russoue
はい、@ Russoue、私のコードは私が以前にリンクしたドキュメントから直接適合しています。私はなぜコードがストリーム抽出を必要としていると思うのか分かりません。私は、あなたの主張を偽っている実用的な例を含めました。ドキュメントは 'lexical_cast'を使用して入力文字列を目的のデータ型に変換します。同じテクニックを使用する場合は、実際には' operator >> 'を実装する必要があります。私の例では、直接構築を使用しています。 *文字列からカスタムタイプを作成する方法は、この質問の対象外です。 –