name enum code c++ boost validation boost-program-options

c++ - code - typedef enum c



Boost Validator personalizado para Enum (1)

Estoy tratando de validar la entrada de la línea de comandos a un Enum que he definido, pero obtengo errores de compilación. He utilizado las opciones complejas de Handle con las opciones de programa de Boost como un ejemplo para trabajar.

namespace po = boost::program_options; namespace Length { enum UnitType { METER, INCH }; } void validate(boost::any& v, const std::vector<std::string>& values, Length::UnitType*, int) { Length::UnitType unit; if (values.size() < 1) { throw boost::program_options::validation_error("A unit must be specified"); } // make sure no previous assignment was made //po::validators::check_first_occurence(v); // tried this but compiler said it couldn''t find it std::string input = values.at(0); //const std::string& input = po::validators::get_single_string(values); // tried this but compiler said it couldn''t find it // I''m just trying one for now if (input.compare("inch") == 0) { unit = Length::INCH; } v = boost::any(unit); } // int main(int argc, char *argv[]) not included

Y para evitar incluir más código del que es necesario, estoy agregando la siguiente opción:

po::options_description config("Configuration"); config.add_options() ("to-unit", po::value<std::vector<Length::UnitType> >(), "The unit(s) of length to convert to") ;

Si el error del compilador es necesario, puedo publicarlo, pero esperaba mantener la pregunta con una apariencia simple. He intentado buscar ejemplos, pero el otro ejemplo que realmente pude encontrar fue el de example / regex.cpp del sitio web de Boost .

  1. ¿Se encuentra la diferencia entre mi escenario y los ejemplos, excepto que el mío es un Enum donde los otros son Estructuras? EDITAR: Mi escenario no requería una sobrecarga del validador personalizado.
  2. ¿Hay una manera de sobrecargar el método de validación para un Enum? EDIT: no es necesario.

En su caso, simplemente necesita sobrecargar el operator>> para extraer una Length::Unit de un istream , como se muestra aquí:

#include <iostream> #include <boost/foreach.hpp> #include <boost/program_options.hpp> namespace Length { enum Unit {METER, INCH}; std::istream& operator>>(std::istream& in, Length::Unit& unit) { std::string token; in >> token; if (token == "inch") unit = Length::INCH; else if (token == "meter") unit = Length::METER; else in.setstate(std::ios_base::failbit); return in; } }; typedef std::vector<Length::Unit> UnitList; int main(int argc, char* argv[]) { UnitList units; namespace po = boost::program_options; po::options_description options("Program options"); options.add_options() ("to-unit", po::value<UnitList>(&units)->multitoken(), "The unit(s) of length to convert to") ; po::variables_map vm; po::store(po::parse_command_line(argc, argv, options), vm); po::notify(vm); BOOST_FOREACH(Length::Unit unit, units) { std::cout << unit << " "; } std::cout << "/n"; return 0; }

Un validador personalizado no es necesario.