boost program_options:多次使用零参数选项?

vol*_*tan 4 c++ boost

我想知道是否可以通过 boost::program_options 多次使用零参数选项。

我有这样的想法:

mytool --load myfile --print_status --do-something 23 --print_status
Run Code Online (Sandbox Code Playgroud)

使用一个“print_status”参数很容易实现这一点,但对我来说如何使用此选项两次并不明显(在我的情况下,如果多次指定零参数选项,boost 会引发异常) .

所以,问题是:

是否有任何(简单的)方法可以通过 program_options 的开箱即用功能来实现这一点?

现在,这似乎是当前 program_options 实现的一个缺点。

PS:

之前已经有过类似的问题(都是四年多),没有找到解决办法:

http://lists.boost.org/boost-users/2006/08/21631.php

http://benjaminwolsey.de/de/node/103

该线程包含一个解决方案,但它是否是一个有效的解决方案并不明显,而且对于这样一个简单的功能来说似乎相当复杂:

使用 Boost program_options 指定级别(例如 --verbose)

eca*_*mur 5

如果你不需要计算选项被指定的次数,这很容易(如果有点奇怪);只需将变量声明为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()
    )
// ...
Run Code Online (Sandbox Code Playgroud)

指定 avector禁止多参数检查;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;
}
Run Code Online (Sandbox Code Playgroud)

例子。

请注意,与链接的问题不同,这不允许另外指定一个值(例如--verbose 6) - 如果您想做一些复杂的事情,您需要编写自定义value_semantic子类,因为 Boost 的现有语义不支持它。