Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost程序选项统计标志出现的次数_C++_Boost_Boost Program Options - Fatal编程技术网

C++ boost程序选项统计标志出现的次数

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更结构化(可以说更简单) 这里有一个方法:

我试图以某种方式编程,让程序的用户指定程序的详细程度,从0到3。有人告诉我,可能有一种方法可以设置程序选项,以便我能够检测标志出现的次数,然后相应地运行我的程序

例如:
[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
$