12

我正在使用 boost::program_options 库来处理命令行参数。我需要通过 -r 选项接受文件名,以防它为空(-r 不带参数)我需要使用标准输入。

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

您可以尝试使用multitokenandzero_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 回答