【问题标题】:How to accept empty value in boost::program_options如何在 boost::program_options 中接受空值
【发布时间】:2009-11-26 16:01:33
【问题描述】:

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

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

在这种情况下,boost 不会接受没有参数的 -r 并抛出异常。 default_value () 选项不起作用,即使用户没有给出 -r 选项,它也会使库返回值。

任何想法如何解决?

【问题讨论】:

    标签: c++ boost boost-program-options


    【解决方案1】:

    请使用implicit_value方法,例如

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

    这使得该选项接受 0 或 1 个标记,如果没有提供标记,它将像提供了 'stdin' 一样工作。当然,您可以选择任何其他隐式值——包括 mch 建议的空字符串和 '-'。

    【讨论】:

    • @Vladimir Prus,这是另一个关于这里没有值的选项的问题stackoverflow.com/questions/7174781/… 我希望能够为这些选项添加通知程序或编写一个补丁来启用它。请发表评论,谢谢。
    • 不幸的是,由于某种原因,在 INI 文件中给出空值时,这不起作用。
    【解决方案2】:

    您可以尝试使用multitokenzero_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 选项,您会想抛出错误。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • Boost::program_options 确实通过 zero_tokens() 允许这样做。
      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多