我正在尝试以某种方式为我的程序用户指定从0到3指定程序详细程度的程序。有人告诉我可能有办法设置程序选项以便我能够检测到标志的出现次数,然后相应地运行我的程序。
实施例:
[none] -> level 0
-v -> level 1
-vv -> level 2
-vvv -> level 3
有人知道这是否可行?我是否只需要设置三种不同的选项,每种选择一种?我试图寻找一个类似的例子,但我担心我可能会搜索错误的东西。
答案 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;
}
工作原理:
variables_map
包含'verbosity'参数,则必须在命令行中提及-v或--verbosity。因此,在字符串中添加“v”。示例:
$ ./a.out -vvvv
verbosity: 4
$