質問

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

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

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

回避方法はありますか?

役に立ちましたか?

解決

implicit_value メソッドを使用してください。例:

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

これにより、オプションは0または1トークンを受け入れます。トークンが提供されない場合は、 'stdin'が提供されたかのように動作します。もちろん、空の文字列やmchが示唆する「-」など、他の暗黙的な値を選択できます。

他のヒント

multitoken および zero_tokens オプションでトリックを試すことができます:

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;

次に、 replay ベクトル内の要素の数をカウントします。複数の引数が replay オプションに渡された場合、エラーをスローする必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top