boost程序选项计算标志的出现次数

时间:2016-07-07 14:22:51

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

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

实施例: [none] -> level 0 -v -> level 1 -vv -> level 2 -vvv -> level 3

有人知道这是否可行?我是否只需要设置三种不同的选项,每种选择一种?我试图寻找一个类似的例子,但我担心我可能会搜索错误的东西。

1 个答案:

答案 0 :(得分:1)

我想不出一个好方法。 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;

}

工作原理:

  1. 使用同义词“-v”定义名为“--verbosity”的选项。
  2. 'verbosity'采用字符串参数,我们默认为“”
  3. 我们检查字符串是否仅包含'v's
  4. 如果variables_map包含'verbosity'参数,则必须在命令行中提及-v或--verbosity。因此,在字符串中添加“v”。
  5. 详细程度是字符串的长度。
  6. 示例:

    $ ./a.out -vvvv
    verbosity: 4
    $