我想知道是否可以使用boost :: program_options多次使用零参数选项。
我有这样的想法:
mytool --load myfile --print_status --do-something 23 --print_status
使用一个“print_status”参数很容易实现这一点,但对我来说,如何使用此选项两次是不明显的(在我的情况下,如果一个提升会抛出异常)零参数选项被多次指定。)
所以,问题是:
是否有任何(简单)方法可以通过program_options的开箱即用功能实现此目的?
目前,这似乎是当前program_options实施的一个缺点。
P.S:
过去已经有类似的问题(都是四年以上),没有找到解决方案:
http://lists.boost.org/boost-users/2006/08/21631.php
http://benjaminwolsey.de/de/node/103
这个主题包含一个解决方案,但是它是否是一个有效的解决方案并不明显,对于这样一个简单的功能来说它似乎相当复杂:
Specifying levels (e.g. --verbose) using Boost program_options
答案 0 :(得分:3)
如果您不需要计算指定选项的次数,则相当容易(如果有点奇怪);只需将变量声明为vector<bool>
并设置以下参数:
std::vector<bool> example;
// ...
desc.add_options()
("example,e",
po::value(&example)
->default_value(std::vector<bool>(), "false")
->implicit_value(std::vector<bool>(1), "true")
->zero_tokens()
)
// ...
指定vector
会抑制多个参数检查; default_value
表示向量默认为空,implicit_value
表示如果指定-e/--example
则将其设置为1元素向量,zero_tokens
表示不使用任何向量跟随代币。
如果至少指定-e
或--example
一次,example.size()
将完全1
;否则它将是0
。
如果你做想要计算选项发生的次数,那么编写自定义类型和验证器就很容易了:
struct counter { int count = 0; };
void validate(boost::any& v, std::vector<std::string> const& xs, counter*, long)
{
if (v.empty()) v = counter{1};
else ++boost::any_cast<counter&>(v).count;
}
请注意,与链接问题不同,这不允许另外指定一个值(例如--verbose 6
) - 如果你想做一些复杂的事情,你需要编写一个自定义的value_semantic
子类,因为Boost现有的语义不支持它。