12

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

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

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

回避する方法はありますか?

4

3 に答える 3

27

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

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

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

于 2009-11-27T17:04:56.657 に答える
7

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オプションに渡された場合は、エラーをスローする必要があります。

于 2009-11-26T16:53:04.537 に答える
1

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

于 2009-11-26T16:15:33.990 に答える