2010-03-05 5 views
4

Boost.Program_options offre une possibilité de passer plusieurs jetons via les arguments de ligne de commande comme suit:Boost.Program_options nombre fixe de jetons

std::vector<int> nums;  

po::options_description desc("Allowed options"); 
desc.add_options() 
    ("help", "Produce help message.") 
    ("nums", po::value< std::vector<int> >(&nums)->multitoken(), "Numbers.") 
; 

po::variables_map vm; 
po::store(po::parse_command_line(argc, argv, desc), vm); 
po::notify(vm); 

Cependant, ce qui est le meilleur moyen d'accepter un nombre fixe d'arguments? La seule solution que je pourrais venir est d'assigner manuellement des valeurs:

int nums[2];  

po::options_description desc("Allowed options"); 
desc.add_options() 
    ("help", "Produce help message.") 
    ("nums", "Numbers.") 
; 

po::variables_map vm; 
po::store(po::parse_command_line(argc, argv, desc), vm); 

if (vm.count("nums")) { 
    // Assign nums 
} 

Cela semble un peu maladroit. Y a-t-il une meilleure solution?

Répondre

2

La bibliothèque boost fournit uniquement les mécanismes prédéfinis. Une recherche rapide n'a pas trouvé quelque chose avec un nombre fixe de valeurs. Mais vous pouvez le créer vous-même. Le po::value< std::vector<int> >(&nums)->multitoken() est juste une classe spécialisée value_semantic. Comme vous pouvez le voir, cette classe offre les méthodes min_tokens et max_tokens, ce qui semble faire exactement ce que vous voulez. Si vous regardez le definition de la classe typed_value (c'est l'objet qui est créé, quand vous appelez po::value< std::vector<int> >(&nums)->multitoken()) vous pouvez obtenir la compréhension de la façon dont les méthodes devraient être remplacées.

+0

J'ai vu 'min_tokens' et' max_tokens', mais je n'étais pas certain de la façon dont ils devaient être utilisés. Merci d'avoir signalé la classe 'typed_value'. Il semble que ce soit la voie à suivre, même si ce n'est pas aussi facile que je l'aurais espéré. – kloffy

Questions connexes