c++ boost-program-options

c++ - boost-program-options: notificador para opciones sin valor



(3)

Este es un ejemplo completo de cómo proporcionar una marca como una opción para complementar las respuestas actuales:

#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 (yo uso 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

Ejecutar el programa sin ninguna opción resulta en:

./untitled4 overwrite is: false

Sin embargo, si se ejecuta con la opción / bandera ''-o'' se obtiene:

./untitled4 -o overwrite is: true

Uno puede usar el notificador para las opciones analizadas solo si tienen valor_semántico. ¿Cuál es la mejor manera de que las opciones sin valor sean manejadas automáticamente por el notificador dado?

El enfoque simple es hacer un valor ficticio_semántico con una asignación implícita, para que un usuario pueda pasar la opción sin un valor. Esto conduce a una posibilidad de valores proporcionados explícitamente. Se puede agregar una verificación en tiempo de ejecución si se proporcionó el valor y arrojar un error.

Actualización: PERO, esto no funciona en presencia de opciones posicionales, debido a que el valor de una opción posicional puede seguir a la opción sin valor que genera una excepción como un valor dado a ella.


Utilice el modificador zero_tokens . Parece que también necesita usar implicit_value , pero el analizador de opciones no consumirá nada después del nombre de la opción. En cambio, cuando la opción se nota en la línea de comando, el valor implícito se asignará a la opción, lo que activará el notificador de la opción (así que asegúrese de proporcionar una función de notificador). Aparentemente, también es importante que el tipo de valor de la opción sea una string . No tengo claro por qué.

void got_foo(std::string const&); desc.add_options() ("foo", po::value<std::string>() ->implicit_value("") ->zero_tokens() ->notifier(&got_foo), "foo description") ;


Un chico OXPEHOMETP en un foro de programadores rusos me dio un consejo para usar boost::program_options::bool_switch() .

Al definir una opción sin valor a través de una interfaz de valor permitido, se debe pasar no boost::program_options::typed_value() como semántica, sino bool_switch() . Esto significa que no se puede tomar ningún valor explícitamente para esta opción desde la línea de comandos. Se puede encontrar información al respecto en http://www.boost.org/doc/libs/release/doc/html/boost/program_options/bool_switch.html