2009-11-26 22 views
12

私はboost :: program_optionsライブラリを使ってコマンドラインパラメータを処理しています。 -rオプションでファイル名を受け入れる必要があります。空の場合(-rはparamsなしで指定します)、stdinを使う必要があります。boost :: program_optionsで空の値を受け入れる方法

desc.add_options() 
("replay,r", boost::program_options::value<std::string>(), "bla bla bla") 

この場合、boostではparamsなしで-rを受け入れられず、例外がスローされます。 default_value()オプションは、ユーザーが-rオプションを指定しなくても、ライブラリの戻り値と同様に機能しません。

どのように対処するのですか?

答えて

26

例えば

desc.add_options() 
("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla") 

このオプションは0か1のいずれかのトークンを受け入れなり、何もトークンが提供されていない場合は、「標準入力」が提供された場合、それはとして機能する、implicit_valueメソッドを使用してください。もちろん、空の文字列やmchのように ' - 'を含む他の暗黙的な値を選択することもできます。

+0

ありがとうございました!完全に動作します – cppalex

+0

@Vladimir Prus、ここには値がないオプションについての別の質問がありますhttp://stackoverflow.com/questions/7174781/boost-program-options-notifier-for-options-with-no-value 私はしたいそのようなオプションにノーティファイヤーを追加したり、それを有効にするためのパッチを書くことができます。してください、ありがとう、ありがとう。 – Riga

+0

残念ながら、何らかの理由でINIファイルに空の値が指定されていると、これは機能しません。 –

1

ライブラリをコマンドラインで解析すると、引数を取るかどうかのオプションを持つことはできません。オプションに引数が必要な場合は、引数を指定する必要があります。この場合、標準的な方法(* NIXではとにかく)は、ファイル名として ' - 'を使用して、標準入力から読み込みたいことを示します。

+0

Boost :: program_options *はzero_tokens()でこれを行います。 – Rhubbarb

5

あなたはmultitokenzero_tokensオプションでトリックを試みることができる:それからちょうどreplayベクトルの要素の数を数える

using namespace std; 
namespace po = boost::program_options; 

vector<string> replay; 

po::options_description desc("Allowed options"); 
desc.add_options() 
    ("replay,r", po::value< vector<string> >(&replay)->multitoken()->zero_tokens(), "bla bla bla"); 

po::variables_map vm;   
po::store(po::parse_command_line(argc, argv, desc), vm); 
po::notify(vm);  

if (vm.count("replay")) 
{ 
    size_t s = vm["replay"].as< vector<string> >().size(); 
    if (s == 0) 
    cout << "replay without args" << endl; 
    else if (s == 1) 
    cout << "replay with one arg" << endl; 
    else 
    cout << "replay with multiple args" << endl; 
} 
else 
    cout << "replay not specified" << endl; 

リプレイオプションに複数の引数が渡された場合は、エラーをスローする必要があります。

関連する問題