我想知道是否可以通过 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
该线程包含一个解决方案,但它是否是一个有效的解决方案并不明显,而且对于这样一个简单的功能来说似乎相当复杂:
如果你不需要计算选项被指定的次数,这很容易(如果有点奇怪);只需将变量声明为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 的现有语义不支持它。
| 归档时间: |
|
| 查看次数: |
631 次 |
| 最近记录: |