2016-07-07 56 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