Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

The simple approach is to make a dummy value_semantic with implicit assignment, so a user can pass the option without a value. This leads to a possibility of explicitly provided values. One can add a run-time check if the value was provided and throw an error.

Update: BUT, this doesn't work in presence of positional options, because a positional option's value can follow no-value option raising an exception as s given value to it.

like image 867
Riga Avatar asked Aug 24 '11 11:08

Riga


2 Answers

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

like image 115
Riga Avatar answered Sep 20 '22 16:09

Riga


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 
like image 22
Marcin Avatar answered Sep 17 '22 16:09

Marcin