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
使用一个 "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
如果你不需要计算选项被指定的次数,这是相当容易的(如果有点奇怪);只需将变量声明为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的现有语义。
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 提升::P设置选项无法使所有参数都处于位置状态
- 是否有 g++ 或 clang++ 调试选项来指导可变参数模板化
- C++ Catch 是否有类似 NUnit 的测试用例的东西,具有多个参数/输入选项
- C++编译时/运行时选项和参数,如何处理?
- 如何在 c/c++ 中为参数添加选项?(视觉工作室平台2019)
- 用于在 Visual Studio 中为整个项目或解决方案定义带有参数的预处理器宏的选项
- 什么是clang 选项,以便在GDB中我可以使用std :: cout作为函数参数
- 提升程序选项:参数被多次检测到
- 将参数从升压程序选项导出到doxygen
- 如何将命令行参数与c++中的选项一起传递给函数
- 是否有任何选项可以推迟对可变参数模板中函数调用的评估
- 提升program_options解析选项和参数一起
- 具有接受参数选项的默认构造函数
- 在C++中,如何仅将长选项与必需参数一起使用
- C++的任何命令行解析库是否允许具有N个参数的选项
- 具有数字偏移量的命令行参数选项
- Boost:无法识别的位置参数选项
- Boost program_options:多次使用零参数选项