我正在尝试使用boost :: program_options解析以下语法:
a)
$a.out
verbosity: 0
b)
$a.out -v
verbosity: 1
c)
$a.out -v -v
verbosity: 2
d)
$a.out -vv
verbosity: 2
e) (optional)
$a.out -v3
verbosity: 3
我的计划到目前为止:
#include <iostream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char *argv[])
{
po::options_description desc;
desc.add_options()
("verbose,v", po::value<int>(), "verbose");
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(desc).run(), vm);
po::notify(vm);
std::cout << "verbosity: " << vm["verbose"].as<int>() << std::endl;
return 0;
}
这仅适用于e).如果我将其更改为:
po::value<int>()->default_value(0)
它适用于a)和e).同
po::value<int>()->default_value(0)->implicit_value(1)
它适用于a),b)和e).
我怎样才能解析上述所有案例?
我想我需要一些值向量与zero_tokens()的组合,但我似乎无法让它工作.
最佳答案 获取-v参数的数量使用vm [“verbose”].count.当然,当与vm [“verbose”]组合时,这将导致一些奇怪的结果.作为<>()方法.
要真正做你想要的,你可能必须为该选项编写自己的解析方法.该函数看起来像:
std::pair<std::string, std::string> verbosity_count(const std::string& s)
{
if(s.find("-v") || s.find("--verbose"))
{
// process the verbosity count (this will require a static verbosity count var)
return std::make_pair("-v", value as string);
}
else
{
return std::make_pair(std::string(), std::string());
}
return std::make_pair(std::string(), std::string());
}
您可以通过extra_parser()方法将其附加到命令行解析器(有关详细信息,请参阅boost Program Option docs,其冗长和混乱).