我想不出一個好方法。 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;
}
工作原理:
- 定義一個名爲 「--verbosity」 用同義詞 「-v」 選項。
- 「冗長」需要一個字符串參數,我們默認爲「」
- 我們檢查字符串只包含「V的
- 如果
variables_map
包含‘冗長’的說法,那麼-v或--verbosity必須已在命令行中提及。因此,給字符串添加'v'。
- 詳細度是字符串的長度。
例如:
$ ./a.out -vvvv
verbosity: 4
$
謝謝!我明白你的意思不是很乾淨,但是它符合我的要求。我現在擔心的是,它不會與其他選項放在一起(例如,'-vvdb'會給我「無效的冗長度」,即使我有其他帶有同義詞'd'和'b'的標誌。但是,我假設是不可避免的,我可以在文檔中指出詳細信息需要單獨指定 – wKavey
另外 - 如果'-v'選項無法傳遞位置參數(輸入文件),我現在遇到了問題如果存在多個v(例如:'-vv input_file'或者如果我在一個v -v -d input_file後面包含另一個參數,而不是其他方式('-v input_file'))線索? – wKavey