【问题标题】:boost program_options: using zero-parameter options multiple times?boost program_options:多次使用零参数选项?
【发布时间】:2016-02-22 16:37:26
【问题描述】:

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

我有这样的想法:

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

使用 one "print_status" 参数很容易实现这一点,但对我来说,如何使用此选项两次并不明显(在我的情况下,如果多次指定零参数选项)。

所以,问题是:

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

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

附:

过去已经有类似的问题(都是四年多),但没有找到解决方案:

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

【问题讨论】:

  • 您要计算指定--print_status 的频率还是只允许多次添加它?
  • 只允许多次添加
  • 事实上,计数并不那么重要——我正在编写一个类似管道的数据处理应用程序,并且我希望能够在两者之间进行零参数处理阶段(如“print_status”),例如任意次数

标签: c++ boost


【解决方案1】:

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

【讨论】:

  • 第一个例子对我有用,稍作修改:po::value&lt;std::vector&lt;bool&gt; &gt;() -&gt;default_value(std::vector&lt;bool&gt;(), "false") -&gt;implicit_value(std::vector&lt;bool&gt;(1), "true") -&gt;zero_tokens()
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多