パラメータに許可された入力変数のセットを設定する方法はありますか? たとえば、パラメータ「arg」は、「cat」や「dog」などの文字列値のみを持つことができます。
3 に答える
カスタムバリデーター機能を使用できます。オプションの個別の型を定義してから、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")
;
非常に単純なアプローチは、「animal」を通常の文字列として使用し、通知後に必要に応じてテストしてスローすることです。
if (vm.count("animal") && (!(animal == "cat" || animal == "dog")))
throw po::validation_error(po::validation_error::invalid_option_value, "animal");
Boost.Program_options のドキュメントにざっと目を通しましたが、それができるかどうかはまったくわかりません。このライブラリは、主にコマンド ラインの検証ではなく解析に関係しているように感じます。カスタム バリデーターを使用して何かを解決できる場合もありますが、それには、入力が正しくない場合に例外をスローすることが含まれます (これは、必要以上に深刻なエラーになる可能性があります)。その機能は、「猫」または「犬」ではなく、実際に文字列を取得したことを確認することを目的としていると思います。
私が考えることができる最も簡単な解決策は、ライブラリにコマンドラインを通常どおり解析させ、後で独自のコードを追加して、または--arg
に設定されていることを確認することです。その後、エラーを出力して終了するか、適切なデフォルトに戻すか、好きなようにできます。cat
dog