2016-07-07 58 views
1

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

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

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

回答

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. 定义一个名为 “--verbosity” 用同义词 “-v” 选项。
  2. “冗长”需要一个字符串参数,我们默认为“”
  3. 我们检查字符串只包含“V的
  4. 如果variables_map包含‘冗长’的说法,那么-v或--verbosity必须已在命令行中提及。因此,给字符串添加'v'。
  5. 详细度是字符串的长度。

例如:

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

谢谢!我明白你的意思不是很干净,但是它符合我的要求。我现在担心的是,它不会与其他选项放在一起(例如,'-vvdb'会给我“无效的冗长度”,即使我有其他带有同义词'd'和'b'的标志。但是,我假设是不可避免的,我可以在文档中指出详细信息需要单独指定 – wKavey

+0

另外 - 如果'-v'选项无法传递位置参数(输入文件),我现在遇到了问题如果存在多个v(例如:'-vv input_file'或者如果我在一个v -v -d input_file后面包含另一个参数,而不是其他方式('-v input_file'))线索? – wKavey