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

时间:2015-07-29 09:23:11

标签: c++ boost

我想知道是否可以使用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

1 个答案:

答案 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

Example.

如果你想要计算选项发生的次数,那么编写自定义类型和验证器就很容易了:

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;
}

Example.

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