2010-04-07 7 views
12

exemple très simple:boost :: program_options bug ou fonctionnalité?

 


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

 

Et quelques 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 
 

On dirait que boost :: program_option paramètre menaces "csv" comme "csv_name".
Est-ce une fonctionnalité ou un bug?

Répondre

9

Oui, il s'agit d'une "caractéristique" en raison des options par défaut analysant style. Essayez avec des options courtes, telles que:

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

Ou jouer avec la méthode basic_command_line_parser::style(int). Je n'ai pas essayé ça, donc YMMV.

+4

J'ai raison. parser.style (po :: commande_line_style :: default_style^po :: commande_line_style :: allow_guessing); aide moi. Merci. – Dmitriy

5

J'ai peur que ce soit un bug. Mais, cela devrait être corrigé en 1.42 - avec quelle version avez-vous essayé?

+1

J'utilise la version 1.42.0. Comme je l'ai déjà dit parser.style (po :: commande_line_style :: default_style^po :: commande_line_style :: allow_guessing); aide moi. – Dmitriy

+0

Bonjour Vladimir. Heureux de voir l'auteur répondre pour la bibliothèque :) Que pensez-vous que le bogue est/était - le style d'analyse par défaut? –

+1

Non, le style par défaut est correct. Cependant, si vous avez deux options, l'une nommée "csv" et l'autre nommée "csv_name", et la ligne de commande a "--csv", alors il est raisonnable de préférer une correspondance complète à une correspondance approximative. Je crois que la solution est la suivante: https://svn.boost.org/trac/boost/changeset/59744 –