我正在使用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
形式的选项。
我尝试过一些款式,但我找不到合适的款式。
干杯!
答案 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解析,你只需检查。