【问题标题】:boost program_options on/off flag提升 program_options 开/关标志
【发布时间】:2015-10-16 13:33:43
【问题描述】:

使用bool_switch,我可以编写一个命令行选项来打开一个标志:

bool flag;

po::options_description options;
options.add_options()
    ("on", po::bool_switch(&flag)->default_value(false))
    ;

现在./a.out 将拥有flag==false./a.out --on 将拥有flag==true。但是,为了明确起见,我还想添加一个命令行选项来关闭标志关闭。比如:

options.add_options()
    ("on", po::bool_switch(&flag)->default_value(false))
    ("off", po::anti_bool_switch(&flag)) // ????
    ;

有没有办法在program_options库中做anti_bool_switch,还是我基本上必须写一个代理布尔引用?

【问题讨论】:

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


    【解决方案1】:

    我能想到的一件事(不确定这是否是最好的方法)是使用implicit_value()

    po::typed_value<bool>* store_bool(bool* flag, bool store_as)
    {
        return po::value(flag)->implicit_value(store_as)->zero_tokens();
    }
    

    value 必须使用所需的默认值进行初始化,否则这将满足所需的功能:

    bool value = false;
    options.add_options()
        ("on", store_bool(&value, true))
        ("off", store_bool(&value, false))
        ;
    

    【讨论】:

      【解决方案2】:

      我不确定您的要求是否合理。如果用户输入“./a.out --on --off”会发生什么?

      否则,您只需确保在用户键入“./a.out --off”时不会收到“无法识别的选项”消息,并且您将获得所需的行为。

      bool flag;
      bool flag_off
      
      po::options_description options;
      options.add_options()
          ("on", po::bool_switch(&flag)->default_value(false))
          ("off", po::bool_switch(&flag_off)->default_value(false))    ;
      
      ...
      
      if( flag_on && flag_off )
      {
        cout << "nasty error" << endl; exit(1)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-05
        • 2021-03-16
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多