我正在使用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选项也会使库返回值。
任何想法如何解决?
答案 0 :(得分:27)
请使用implicit_value
方法,例如
desc.add_options()
("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")
这使得该选项接受0或1个令牌,如果没有提供令牌,它将表现为提供了“stdin”。当然,您可以选择任何其他隐式值 - 包括空字符串和' - ',如mch。
所示答案 1 :(得分:6)
您可以尝试使用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
向量中的元素数量。如果将多个参数传递给重播选项,您将要抛出错误。
答案 2 :(得分:1)
我认为任何命令行解析库都不允许您拥有可以接受参数的选项。如果选项需要参数,则必须提供参数。在这种情况下,标准做法(无论如何都是* NIX)是使用' - '作为文件名来表示你想要从标准输入中读取。