提升程序选项:强制“=”

时间:2013-10-17 09:12:40

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

我正在使用boost::program_options,这个问题仅仅是美学。

如何强制std::string选项(或更好,所有选项)仅使用带有“=”的长格式?

现在,我看到的只是“=”被强加在我的int选项上,而字符串没有使用等号:

    po::options_description desc("Allowed options");
    desc.add_options()
        (opt_help, "Show this help message")
        (opt_int,  po::value<int>()->implicit_value(10), "Set an int")
        (opt_str,  po::value<std::string>()->implicit_value(std::string()), "Set a string")
    ;

以上显示的所有选项均为--help--int=4--str FooBar。我只想选择--option=something形式的选项。

我尝试过一些款式,但我找不到合适的款式。

干杯!

1 个答案:

答案 0 :(得分:2)

如果不编写自己的解析器,就无法做到这一点。

http://www.boost.org/doc/libs/1_54_0/doc/html/program_options/howto.html#idp123407504

std::pair<std::string, std::string> parse_option(std::string value)
{
   if (value.size() < 3)
   {
      throw std::logic_error("Only full keys (--key) are allowed");
   }
   value = value.substr(2);
   std::string::size_type equal_sign = value.find('=');
   if (equal_sign == std::string::npos)
   {
      if (value == "help")
      {
         return std::make_pair(value, std::string());
      }
      throw std::logic_error("Only key=value settings are allowed");
   }
   return std::make_pair(value.substr(0, equal_sign),
   value.substr(equal_sign + 1));
}

// when call parse

po::store(po::command_line_parser(argc, argv).options(desc).
extra_parser(parse_option).run(), vm);

但是,你可以用更简单的方式做到这一点

void check_allowed(const po::parsed_options& opts)
{
   const std::vector<po::option> options = opts.options;
   for (std::vector<po::option>::const_iterator pos = options.begin();
        pos != options.end(); ++pos)
   {
      if (pos->string_key != "help" &&
      pos->original_tokens.front().find("=") == std::string::npos)
      {
         throw std::logic_error("Allowed only help and key=value options");
      }
   }
}

po::parsed_options opts = po::command_line_parser(argc, argv).options(desc).
style(po::command_line_style::allow_long | 
po::command_line_style::long_allow_adjacent).run();
check_allowed(opts);

所以,在这种情况下,boost :: po解析,你只需检查。