2010-04-07 2 views
12

Sehr einfaches Beispiel:boost :: program_options Bug oder Feature?

 


#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; 
} 

 

Und einige Tests:

 

>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 
 

sieht aus wie das boost :: program_option Bedrohungen Parameter "csv" als "csv_name".
Ist es eine Funktion oder ein Fehler?

Antwort

9

Ja, dies ist ein "Feature" aufgrund der Standardoptionen style analysieren. Versuchen Sie, mit kurzen Optionen, wie:

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

Oder mit dem basic_command_line_parser::style(int) Verfahren spielen. Ich habe das nicht versucht, also YMMV.

+4

Ich habe Recht. parser.style (po :: command_line_style :: standard_stil^po :: command_line_stil :: allow_guessing); hilft mir. Vielen Dank. – Dmitriy

5

Ich fürchte, das ist ein Fehler. Aber es sollte in 1.42 behoben werden - mit welcher Version hast du es versucht?

+1

Ich verwende Version 1.42.0. Wie ich schon sagte parser.style (po :: command_line_style :: default_style^po :: command_line_style :: allow_guessing); hilft mir. – Dmitriy

+0

Hallo Vladimir. Schön zu sehen, dass der Autor für die Bibliothek antwortet :) Was denken Sie, der Bug ist/war - der Standard-Parsing-Stil? –

+1

Nein, der Standardstil ist in Ordnung. Wenn Sie jedoch zwei Optionen haben, eine mit dem Namen "csv" und eine andere mit dem Namen "csv_name" und die Befehlszeile mit "--csv", ist es sinnvoll, eine vollständige Übereinstimmung mit einer ungefähren Übereinstimmung zu bevorzugen. Ich glaube, das Problem ist das: https://svn.boost.org/trac/boost/changeset/59744 –