2016-07-07 15 views
1

私のプログラムのユーザが私のプログラムの冗長レベルを0から3まで指定する方法でプログラムしようとしています。フラグの出現回数を検出してそれに応じてプログラムを実行できるように、プログラムオプションを設定する方法です。boost program options countフラグの出現回数

例:これが可能であれば [none] -> level 0 -v -> level 1 -vv -> level 2 -vvv -> level 3

誰でも知っていますか?私は3つの異なるオプションを設定する必要がありますか?それぞれの可能性に応じて1つずつ選択します。私は同様の例を探し回ってみましたが、間違ったものを探しているかもしれないと恐れています。

答えて

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. 「冗長」私たちは、その後-vまたは--verbosity必要があり、冗長 『引数「variables_mapが含まれている場合は、Vの
  3. 』という文字列のみが含まれていることを確認し
  4. 「私たちがするようにデフォルト文字列引数を、」取りますコマンドラインで言及されています。したがって、文字列に 'v'を追加します。
  5. 冗長は、文字列の長さです。

例:

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

ありがとう!私はそれが非常にきれいではないことをあなたが意味するものを見ますが、それは私が望むことをします。私の懸念は、他のオプションではうまくいきません(例えば、 '-vvdb'は同義語' d'と 'b'を持つ他のフラグを持っていても"無効な冗長性 "を与えます)。 – wKavey

+0

また、 '-v'オプションが指定されていれば、位置引数(入力ファイル)に渡すことができない問題に遭遇しています。複数のv(ex: '-vv input_file')がある場合や、単一のv' -v -d input_file'の後に別の引数を含めると動作しますが、そうでない場合( '-v input_file')手掛かり? – wKavey

関連する問題