C++ boost程序选项统计标志出现的次数
我试图以某种方式编程,让程序的用户指定程序的详细程度,从0到3。有人告诉我,可能有一种方法可以设置程序选项,以便我能够检测标志出现的次数,然后相应地运行我的程序 例如:C++ boost程序选项统计标志出现的次数,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我试图以某种方式编程,让程序的用户指定程序的详细程度,从0到3。有人告诉我,可能有一种方法可以设置程序选项,以便我能够检测标志出现的次数,然后相应地运行我的程序 例如: [none]->0级 -v->1级 -vv->2级 -vvv->3级 有人知道这是否可能吗?我是否只需要设置三个不同的选项,每个选项一个?我试着四处寻找一个类似的例子,但是我担心我可能搜索了错误的东西。我想不出一个好方法boost::program_options选项语法比getopt更结构化(可以说更简单) 这里有一个方法:
[none]->0级
-v->1级
-vv->2级
-vvv->3级
有人知道这是否可能吗?我是否只需要设置三个不同的选项,每个选项一个?我试着四处寻找一个类似的例子,但是我担心我可能搜索了错误的东西。我想不出一个好方法
boost::program_options
选项语法比getopt
更结构化(可以说更简单)
这里有一个方法:
#include <boost/program_options.hpp>
#include <iostream>
#include <algorithm>
#include <cstdlib>
int main(int argc, char**argv)
{
namespace po = boost::program_options;
std::string verbosity_values;
po::options_description desc("Command Line Options");
desc.add_options()("verbosity,v",
po::value(&verbosity_values)->implicit_value(""),
"verbose");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("verbosity")) {
verbosity_values += "v";
}
if (std::any_of(begin(verbosity_values), end(verbosity_values), [](auto&c) { return c != 'v'; })) {
std::cerr << "invalid verbosity" << std::endl;
std::exit(100);
}
std::cout << "verbosity: " << verbosity_values.size() << std::endl;
}
谢谢我明白你说的不干净是什么意思了,不过这是我想要的。我现在担心的是,它没有将nice与其他选项放在一起(例如,
-vvdb
会给我“无效的详细信息”,即使我有同义词d
和b
的其他标志。但是,我认为这是不可避免的,我可以在文档中指出详细程度需要单独指定。此外,我现在遇到了无法传递位置参数(输入文件)的问题如果-v
选项在前面是一个。如果有多个v(例如:-vv input\u file
,或者如果我在单个v-v-d input\u file
之后包含另一个参数,则该选项有效,但在其他情况下(-v input\u file
),有任何线索吗?
$ ./a.out -vvvv
verbosity: 4
$