我正在使用boost :: program_options库来处理命令行参数。 我需要通过-r选项接受文件名,万一它是空的(-r没有params)我需要使用stdin。

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

在这种情况下,boost不接受-r而没有params并抛出异常。 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 向量中的元素数量。如果将多个参数传递给重播选项,您将要抛出错误。

我认为任何命令行解析库都不允许您拥有可以接受参数的选项。如果选项需要参数,则必须提供参数。在这种情况下,标准做法(无论如何都是* NIX)是使用' - '作为文件名来表示你想要从标准输入中读取。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top