2010-04-07 9 views
12
ejemplo

muy simple:boost :: program_options ¿error o característica?

 


#include <string> 
#include <boost/program_options.hpp> 

namespace po = boost::program_options; 

int main(int argc, char* argv[]) 
{ 
    po::options_description recipients("Recipient(s)"); 
    recipients.add_options() 
     ("csv",   po::value<std::string>(),  "" ) 
     ("csv_name", po::value<unsigned>(),  "" ) 
    ; 

    po::options_description cmdline_options; 
    cmdline_options.add(recipients); 

    po::variables_map vm; 
    po::store(po::command_line_parser(argc, argv).options(cmdline_options).run(), vm); 
    po::notify(vm); 

    return 0; 
} 

 

y algunas pruebas:

 

>Test --csv test 
in option 'csv_name': invalid option value 

>Test --csv_name test 
in option 'csv_name': invalid option value 

>Test --csv_name 0 

>Test --csv text 
in option 'csv_name': invalid option value 

>Test --csv 0 

>Test --csv_name 0 

>Test --csv_name 0 --csv text 
multiple occurrences 
 

Parece que el parámetro amenazas impulso :: program_option "csv" como "csv_name".
¿Es una característica o un error?

Respuesta

9

Sí, esta es una "característica" debido a las opciones predeterminadas de análisis style. Pruebe con las opciones cortas, como:

recipients.add_options() 
    ("csv,c",  po::value<std::string>(), "" ) 
    ("csv_name,C", po::value<unsigned>(), "" ) 
; 

o jugar con el método basic_command_line_parser::style(int). No lo he intentado, así que YMMV.

+4

Tengo razón. parser.style (po :: command_line_style :: default_style^po :: command_line_style :: allow_guessing); me ayuda. Gracias. – Dmitriy

5

Me temo que esto es un error. Pero, debería ser reparado en 1.42. ¿Con qué versión lo intentó?

+1

Estoy usando la versión 1.42.0. Como ya dije, parser.style (po :: command_line_style :: default_style^po :: command_line_style :: allow_guessing); me ayuda. – Dmitriy

+0

Hola Vladimir. Es bueno ver al autor responder por la biblioteca :) ¿Cuál crees que es el error/was - el estilo de análisis predeterminado? –

+1

No, el estilo predeterminado es correcto. Sin embargo, si tiene dos opciones, una llamada "csv" y otra llamada "csv_name", y la línea de comando tiene "--csv", entonces es razonable preferir la coincidencia completa a una coincidencia aproximada. Creo que la solución es esta: https://svn.boost.org/trac/boost/changeset/59744 –

Cuestiones relacionadas