C++ 如何接受boost::program_选项中的空值

C++ 如何接受boost::program_选项中的空值,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我正在使用boost::program_选项库来处理命令行参数。 我需要通过-r选项接受一个文件名,如果它是空的(-r没有参数),我需要使用stdin desc.add_options() ("replay,r", boost::program_options::value<std::string>(), "bla bla bla") desc.添加选项() (“回放,r”,boost::program_options::value(),“bla bla bla bla”) 在

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

desc.add_options()
 ("replay,r", boost::program_options::value<std::string>(), "bla bla bla")
desc.添加选项()
(“回放,r”,boost::program_options::value(),“bla bla bla bla”)
在这种情况下,boost不会接受没有参数的-r并抛出异常。 默认的_值()选项不起作用,因为即使用户没有给出-r选项,它也会使库返回值


有什么想法可以解决吗?

我认为任何命令行解析库都不允许您选择是否接受参数。如果选项需要参数,则必须给出一个参数。在本例中,标准做法(无论如何,在*NIX中)是使用“-”作为文件名,表示要从标准输入中读取

您可以尝试使用
多音
零辅币
选项的技巧:

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;
使用名称空间std;
名称空间po=boost::program\u选项;
矢量回放;
采购订单:选项描述描述(“允许选项”);
说明添加选项()
(“replay,r”,po::value(&replay)->多音()->zero_tokens(),“bla bla bla bla”);
变量映射虚拟机;
po::store(po::parse_命令行(argc、argv、desc)、vm);
po::通知(vm);
if(vm.count(“replay”))
{
size_t s=vm[“replay”].as().size();
如果(s==0)

cout请使用
隐式_值
方法,例如

desc.add_options()
 ("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")
desc.添加选项()
(“replay,r”,po::value()->隐式_值(“标准数据”),“bla bla bla bla bla”)

这使选项接受0或1令牌,如果没有提供令牌,它将充当提供了“stdin”的角色。当然,您可以按照mch的建议选择任何其他隐式值,包括空字符串和“-”。

@Vladimir Prus,这里还有一个关于没有值的选项的问题,我希望能够为suc添加通知程序h选项或编写修补程序来启用它。请发表评论,谢谢。不幸的是,由于某些原因,当INI文件中给出空值时,这不起作用。Boost::program_options允许通过zero_令牌()实现这一点。