我目前拥有的是
("someOption,s", po::bool_switch(&variable)->default_value(false), "")
我希望能够多次指定该参数,每次出现都会切换该布尔值。
示例:
default value = false
./program -s
value == true
./program -s -s
value == false
./program -s -s -s
value == true
有没有办法多次使用bool_switch之类的东西,以便反复打开/关闭?我需要我的自定义类型和验证器吗?
也许我可以以某种方式允许多次指定该选项,然后执行vm.count(“ someOption”)并根据其值(偶/奇)切换我的变量。但是我宁愿在选项描述符(add_options)中指定该行为,而无需稍后检查和修改值。
答案 0 :(得分:4)
我实际上已经花了70分钟试图使它能够使用
composing()
允许重复implicit_value({}, "")
个自定义通知程序的notifier()
-不管选项出现和成功解析的频率如何,它们仅运行一次variables_map
/ store
之后的notify
获取向量值选项的大小。可悲的是,大小始终为1,大概是因为“组合”实际上不是在单个存储操作中组合的(它仅在多个运行之间组合,所以选项的不同 sources 呢?)。 / li>
可悲的结论是,似乎没有办法。在这里,我惯常的口头禅得到了证实:“简单性特朗普全能设计”,我建议这样做,但要使用https://github.com/adishavit/argh:
#include "argh.h"
#include <iostream>
namespace {
template <typename It>
size_t size(std::pair<It, It> const& range) { return std::distance(range.first, range.second); }
}
int main(int argc, char** argv) {
argh::parser p(argc, argv);
auto num_s = size(p.flags().equal_range("s"));
bool const variable = num_s % 2;
std::cout << "Repeated: " << num_s << ", effective " << std::boolalpha << variable;
std::cout << " (Command line was:";
while (*argv) std::cout << " " << *argv++;
std::cout << ")\n";
}
在使用各种命令行运行时,打印:
Repeated: 0, effective false (Command line was: ../build/sotest)
Repeated: 1, effective true (Command line was: ../build/sotest -s)
Repeated: 2, effective false (Command line was: ../build/sotest -s -s)
Repeated: 3, effective true (Command line was: ../build/sotest -s -s -s)
Repeated: 4, effective false (Command line was: ../build/sotest -s -s -s -s)
Repeated: 3, effective true (Command line was: ../build/sotest -s -s -s --other bogus)
答案 1 :(得分:0)
这距离我到目前为止很近。它看起来不是很优雅,更像是一种解决方法,我很乐意知道更好(“更短”)的解决方案。代码也可能存在一些问题,请随时纠正我。 当前,仅当default被视为false时,它才有效。我不知道如何从true开始,它需要以某种方式知道validate函数中的默认值。 它超出了此问题的范围,希望可以在此处解决:boost::program_options custom validate and default value
constexpr
这似乎正常工作,我可以这样称呼:
./程序-t -t -T -t -T
并切换参数。