我想不出一个好方法。 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