我想使用boost::program_options来指定所需的详细程度,这是很常见的。
./test -v # verbosity = 1
./test -vvv # verbosity = 3
./test -v blah blah -v # verbosity = 2
我知道如何处理需要一个值的选项的多次出现,但我想要的是一个开关的多次出现。
desc.add_options()
("verbosity,v", bool_switch(), "Increase verbosity");
但如果提供了多个-v选项,则会失败,并出现multiple_occurrence异常。
多个boolean选项可以用类似
desc.add_options()
("verbose,v", value<std::vector<int> >(), "Increase verbosity");
但这需要为每个选项指定一个值,例如
./test -v 1 -v 1 -v 1
2条答案
按热度按时间ni65a41a1#
我也遇到了这个问题,并提出了以下建议。希望它能对某些人有用,即使对于最初的海报来说已经太晚了。
这是用C++20和Boost 1.77编译的。下面是它的运行情况:
jfewjypa2#
Huw Walters的答案对我来说非常有用。我在上面做了一些扩展,允许通过一个数字参数显式地设置verbosity级别。所以所有这些调用都会将verbosity设置为4:
不幸的是,该解决方案的缺点是在
-v
之后混合其他选项不起作用。因此,即使x
也是法律的选项,app -vx
也会产生错误。下面是代码。要使用它,请提供:(“verbose,v”,new po_CountAndAddValue(&verbose),“增加详细度”);作为运算符到
add_options()
。如果您不希望混合使用带有和不带有数字参数的verbosity选项,则可以为这种情况添加错误报告,如下所示:
所有这些说明符在第一个版本中都可以将详细程度设置为4,但在第二个版本中失败了:
所有这些都是用C++17和Boost 1.74测试的。