c++ boost boost-program-options

c++ - Argumentos vectoriales en las opciones del programa Boost



boost-program-options (2)

Tengo dos preguntas relacionadas:

  1. ¿Cuál es la forma más simple de permitir pasar una serie de valores, usando las Opciones del Programa Boost? Mi objetivo es evitar prog --opt 1 --opt 2 --opt 3 y prog --opt 1 2 3 lugar.

  2. ¿Cuál es la forma más sencilla de tener una opción que toma exactamente dos números, por ejemplo, prog --opt 137 42 ?

(No necesito ningún parámetro de programa "gratuito")


Esta es una respuesta tardía, pero espero que ayude a alguien. Puede usar fácilmente la misma técnica en el ítem n. ° 1, excepto que necesita agregar otra validación en la cantidad de ítems en su vector:

del ejemplo de rcollyer:

namespace po = boost::program_options; po::option_descriptions desc(""); desc.add_options() ("opt", po::value<std::vector<int> >()->multitoken(), "description"); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); vector<int> opts; if (!vm["opt"].empty() && (opts = vm["opt"].as<vector<int> >()).size() == 2) { // good to go }


Para la primera parte, esto debería funcionar

namespace po = boost::program_options; po::option_descriptions desc(""); desc.add_options() ("opt", po::value<std::vector<int> >()->multitoken(), "description");

La segunda parte requiere un poco más de trabajo. La función po::value devuelve un po::typed_value< T, charT > en el que tendrá que anular el comportamiento de varias funciones, de la siguiente manera

template< typename T, typename charT = char > class fixed_tokens_typed_value : public po::typed_value< T, charT > { unsigned _min, _max; typedef po::typed_value< T, charT > base; public: fixed_tokens_typed_value( T * t, unsigned min, unsigned max ) : _min(min), _max(max), base( t ) { base::multitoken(); } virtual multi_typed_value* min_tokens( unsigned min ) { _min = min; return *this; } unsigned min_tokens() const {return _min;} virtual multi_typed_value* max_tokens( unsigned max ) { _max = max; return *this; } unsigned max_tokens() const {return _max;} base* zero_tokens() { _min = _max = 0; base::zero_tokens(); return *this; } }

que debe ir acompañado de

template< typename T > fixed_tokens_typed_value< T > fixed_tokens_value(unsigned min, unsigned max) { return fixed_tokens_typed_value< T >(0, min, max ); } template< typename T > fixed_tokens_typed_value< T > fixed_tokens_value(T * t, unsigned min, unsigned max) { fixed_tokens_typed_value< T >* r = new fixed_tokens_typed_value< T >(t, min, max); return r; }

Entonces

desc.add_options() ("opt", po::fixed_tokens_value<std::vector<int> >(2,2), "description");

Deberia trabajar. Todavía no he tenido la oportunidad de probarlo, por lo que es probable que contenga algunos errores. Pero, como mínimo, debe darle una idea de lo que necesita.