私は良い方法を考えることができません。 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;
}
仕組み:
- 同義語 "-v" と "--verbosity" と呼ばれるオプションを定義します。
- 「冗長」私たちは、その後-vまたは--verbosity必要があり、冗長 『引数「
variables_map
が含まれている場合は、Vの
- 』という文字列のみが含まれていることを確認し
- 「私たちがするようにデフォルト文字列引数を、」取りますコマンドラインで言及されています。したがって、文字列に 'v'を追加します。
- 冗長は、文字列の長さです。
例:
$ ./a.out -vvvv
verbosity: 4
$
ありがとう!私はそれが非常にきれいではないことをあなたが意味するものを見ますが、それは私が望むことをします。私の懸念は、他のオプションではうまくいきません(例えば、 '-vvdb'は同義語' d'と 'b'を持つ他のフラグを持っていても"無効な冗長性 "を与えます)。 – wKavey
また、 '-v'オプションが指定されていれば、位置引数(入力ファイル)に渡すことができない問題に遭遇しています。複数のv(ex: '-vv input_file')がある場合や、単一のv' -v -d input_file'の後に別の引数を含めると動作しますが、そうでない場合( '-v input_file')手掛かり? – wKavey