c++ boost-program-options

c++ - Las opciones del programa Boost permitieron un conjunto de valores de entrada.



boost-program-options (3)

¿Hay una manera de establecer un conjunto permitido de variables de entrada para los parámetros? Por ejemplo, el parámetro "arg" solo puede tener valores de cadena como "cat" y "dog".


He hojeado la documentación de Boost.Program_options, y no me resulta nada claro si puedes hacerlo. Me da la impresión de que la biblioteca se ocupa principalmente de analizar la línea de comandos, no de validarla. Es posible que pueda hacer algo con un validador personalizado , pero eso implica lanzar excepciones cuando obtiene entradas erróneas (lo que puede ser un error más grave de lo que desea). Creo que esa característica está más orientada a asegurarse de que realmente tengas una cuerda, no que sea "gato" o "perro".

La solución más simple que se me ocurre es dejar que la biblioteca analice la línea de comandos como de costumbre, y luego agregar su propio código para verificar que --arg se configuró como cat o dog . Luego puede imprimir un error y salir, volver a un valor predeterminado adecuado, o lo que quiera.


Un enfoque muy simple es tener "animal" como una cadena normal y después de notificarlo, haga una prueba y lance si es necesario.

if (vm.count("animal") && (!(animal == "cat" || animal == "dog"))) throw po::validation_error(po::validation_error::invalid_option_value, "animal");


Puede utilizar la función de validador personalizado . Defina un tipo distinto para su opción y luego sobrecargue la función de validate en ese tipo.

struct catdog { catdog(std::string const& val): value(val) { } std::string value; }; void validate(boost::any& v, std::vector<std::string> const& values, catdog* /* target_type */, int) { using namespace boost::program_options; // Make sure no previous assignment to ''v'' was made. validators::check_first_occurrence(v); // Extract the first string from ''values''. If there is more than // one string, it''s an error, and exception will be thrown. std::string const& s = validators::get_single_string(values); if (s == "cat" || s == "dog") { v = boost::any(catdog(s)); } else { throw validation_error(validation_error::invalid_option_value); } }

Las excepciones lanzadas desde ese código no son diferentes de las excepciones lanzadas para cualquier otro valor de opción no válido, por lo que ya debe estar preparado para manejarlas.

Utilice el tipo de opción especial en lugar de solo una string cuando defina sus opciones:

desc.add_options() ("help", "produce help message") ("arg", po::value<catdog>(), "set animal type") ;

He compuesto un ejemplo en vivo que demuestra el uso de este código .