boost-program-options: notifier for options with no value

前端 未结 3 434
终归单人心
终归单人心 2020-12-06 04:17

One can use notifier for parsed options only if they have value_semantic. What is the best way for no-value options to be automatically handled by the given notifier?

相关标签:
3条回答
  • 2020-12-06 04:38

    Use the zero_tokens modifier. It seems you also need to use implicit_value, but anything provided after the option name won't be consumed by the option parser. Instead, when the option is noticed on the command line, the implicit value will be assigned to the option, triggering the option's notifier (so make sure to provide a notifier function). Apparently, it's also important for the option's value type to be string. I'm not clear on why.

    void got_foo(std::string const&);
    
    desc.add_options()
      ("foo", 
       po::value<std::string>()
         ->implicit_value("")
         ->zero_tokens()
         ->notifier(&got_foo),
       "foo description")
    ;
    
    0 讨论(0)
  • 2020-12-06 04:41

    This is full example on providing a flag as an option to complement current answers:

    #include <iostream>
    
    #include <boost/program_options.hpp>
    
    using namespace std;
    
    namespace po = boost::program_options;
    
    
    int main(int ac, char* av[])
    {
        po::options_description desc("Allowed options");
    
        desc.add_options()
            ("help", "produce help message")
            ("overwrite,o", po::bool_switch()->default_value(false),
                            "enable file overwrite");
    
        po::variables_map vm;
        po::store(po::parse_command_line(ac, av, desc), vm);
    
        boolalpha(cout);  // display true and false for bool
        cout << "overwrite is: " << vm["overwrite"].as<bool>() << endl;
    
        return 0;
    }
    

    Mine qmake pro file (I use Qt 5.4):

    TEMPLATE = app
    CONFIG += console
    CONFIG += c++14
    CONFIG -= app_bundle
    CONFIG -= qt
    
    SOURCES += main.cpp
    
    
    include(deployment.pri)
    qtcAddDeployment()
    
    INCLUDEPATH += /opt/boost_1_57_0
    
    unix:!macx: LIBS += -L/opt/boost_1_57_0/stage/lib -lboost_program_options
    

    Running the program without any options results in:

    ./untitled4
    overwrite is: false
    

    However running with '-o' option/flag gives:

    ./untitled4 -o
    overwrite is: true
    
    0 讨论(0)
  • 2020-12-06 04:50

    One guy OXPEHOMETP on a russian programmers forum gave me a pice of advice to use boost::program_options::bool_switch().

    When defining an option with no value via value-permitted interface, one must pass not boost::program_options::typed_value() as semantics, but bool_switch(). This means that no value can be explicitly taken for this option from the command line. One can find info about it at http://www.boost.org/doc/libs/release/doc/html/boost/program_options/bool_switch.html

    0 讨论(0)
提交回复
热议问题