boost :: program_options bool_switch使用了多次

时间:2018-08-07 09:21:49

标签: c++ boost boost-program-options

我目前拥有的是

("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)中指定该行为,而无需稍后检查和修改值。

2 个答案:

答案 0 :(得分:4)

我实际上已经花了70分钟试图使它能够使用

  • composing()允许重复
  • 具有implicit_value({}, "")个自定义通知程序的
  • 向量值虚拟选项(它们只能运行一次)
  • 自定义notifier()-不管选项出现和成功解析的频率如何,它们仅运行一次
  • variables_map / store之后的notify获取向量值选项的大小。可悲的是,大小始终为1,大概是因为“组合”实际上不是在单个存储操作中组合的(它仅在多个运行之间组合,所以选项的不同 sources 呢?)。 / li>

可悲的结论是,似乎没有办法。在这里,我惯常的口头禅得到了证实:“简单性特朗普全能设计”,我建议这样做,但要使用https://github.com/adishavit/argh

Live On Coliru

#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

并切换参数。