c++ - Argumentos vectoriales en las opciones del programa Boost
boost-program-options (2)
Tengo dos preguntas relacionadas:
¿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
yprog --opt 1 2 3
lugar.¿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.