Boost program_options:多次使用零参数选项

boost program_options: using zero-parameter options multiple times?

本文关键字:参数 选项 program options Boost      更新时间:2023-10-16

我想知道是否有可能使用零参数选项多次与boost::program_options。

我有这样的想法:

mytool --load myfile --print_status --do-something 23 --print_status

使用一个 "print_status"参数很容易得到这个工作,但对我来说不太明显的是如何使用这个选项两次(在我的情况下,如果零参数选项被指定了不止一次,boost会抛出异常)。

所以,问题是:

是否有任何(简单)的方法来实现这与开箱即用的功能从program_options?

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

:

p.s.

在过去已经有类似的问题(都超过4年),没有找到解决方案:

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

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

这个线程包含一个解决方案,但它是不是一个工作不明显,它似乎相当复杂,这样一个简单的功能:

使用Boost program_options

指定级别(例如——verbose)

如果你不需要计算选项被指定的次数,这是相当容易的(如果有点奇怪);只需将变量声明为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的现有语义。