提升程序选项计数标志的出现次数

boost program options count number of occurrences of a flag

本文关键字:标志 程序 选项      更新时间:2023-10-16

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

例: [none] -> level 0 -v -> level 1 -vv -> level 2 -vvv -> level 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;
}

工作原理:

    定义一个名为"--
  1. verbosity"的选项,同义词"-v"。
  2. 'verbosity' 需要一个字符串参数,我们默认为 "
  3. 我们检查字符串是否只包含 'v's
  4. 如果variables_map包含"详细"参数,则必须在命令行中提及 -v 或 --verbosity。因此,在字符串中添加"v"。
  5. 详细程度是字符串的长度。

例:

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