boost program_options: 多次使用零参数选项?
boost program_options: using zero-parameter options multiple times?
我想知道是否可以在 boost::program_options 中多次使用零参数选项。
我有这样的想法:
mytool --load myfile --print_status --do-something 23 --print_status
使用 one "print_status" 参数很容易得到这个,但我不清楚如何使用这个选项两次(在我的例子中) ,如果多次指定零参数选项,boost 将抛出异常。
所以,问题是:
是否有任何(简单的)方法可以使用 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
如果你不需要计算选项被指定的次数,这很容易(如果有点奇怪的话);只需将变量声明为 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 现有语义的支持。
我想知道是否可以在 boost::program_options 中多次使用零参数选项。
我有这样的想法:
mytool --load myfile --print_status --do-something 23 --print_status
使用 one "print_status" 参数很容易得到这个,但我不清楚如何使用这个选项两次(在我的例子中) ,如果多次指定零参数选项,boost 将抛出异常。
所以,问题是:
是否有任何(简单的)方法可以使用 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
如果你不需要计算选项被指定的次数,这很容易(如果有点奇怪的话);只需将变量声明为 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 现有语义的支持。