2010-09-01 4 views
15

Comment procéder pour spécifier des options courtes sans leurs longues contreparties en mode boost?Options courtes uniquement dans boost :: options_programme

(",w", po::value<int>(), "Perfrom write with N frames") 

génère cette

-w [ -- ] arg : Perfrom write with N frames 

Tout moyen de spécifier les options courtes seulement?

+0

Vous souhaitez que le texte d'aide ne désactive que les options courtes? –

+1

Non, je ne veux que des options telles que -v au lieu de --verbose ou en définissant les deux. La spécification de ", v" au lieu de "v" fait l'affaire mais corrige la liste imprimée de la description. – Novikov

Répondre

15

Si vous utilisez l'analyseur de ligne de commande, il existe un moyen de définir différents styles. La solution consisterait donc à n'utiliser que des options longues et à activer le style allow_long_disguise qui permet de spécifier de longues options avec un tiret (c'est-à-dire "-long_option"). Voici un exemple:

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

namespace options = boost::program_options; 
using namespace std; 

int 
main (int argc, char *argv[]) 
{ 
     options::options_description desc (string (argv[0]).append(" options")); 
     desc.add_options() 
      ("h", "Display this message") 
     ; 
     options::variables_map args; 
     options::store (options::command_line_parser (argc, argv).options (desc) 
         .style (options::command_line_style::default_style | 
           options::command_line_style::allow_long_disguise) 
         .run(), args); 
     options::notify (args); 
     if (args.count ("h")) 
     { 
      cout << desc << endl; 
      return 0; 
     } 
} 

Il y aura un petit problème avec la sortie de la description que:

$ ./test --h 
./test options: 
    --h     Display this message 

Et que l'on est difficile de fixer parce que c'est ce qui est utilisé pour former cette sortie: La seule solution à ce problème est de remplacer «-» par «-» dans la chaîne résultante. Par exemple:

#include <iostream> 
#include <sstream> 
#include <boost/program_options.hpp> 
#include <boost/algorithm/string/replace.hpp> 

namespace options = boost::program_options; 
using namespace std; 

int 
main (int argc, char *argv[]) 
{ 
     options::options_description desc (string (argv[0]).append(" options")); 
     desc.add_options() 
      ("h", "Display this message") 
     ; 
     options::variables_map args; 
     options::store (options::command_line_parser (argc, argv).options (desc) 
         .style (options::command_line_style::default_style | 
           options::command_line_style::allow_long_disguise) 
         .run(), args); 
     options::notify (args); 
     if (args.count ("h")) 
     { 
      std::stringstream stream; 
      stream << desc; 
      string helpMsg = stream.str(); 
      boost::algorithm::replace_all (helpMsg, "--", "-"); 
      cout << helpMsg << endl; 
      return 0; 
     } 
} 

La meilleure chose que vous pouvez faire est de corriger le code où il imprime vide longue description de l'option et envoyer un patch à l'auteur de la bibliothèque.

+0

Très perspicace, merci! – Novikov

+1

@Novikov Vous êtes les bienvenus. FYI - Je viens de créer un ticket pour votre problème et partiellement corrigé cette fonction format_name(). Voir https://svn.boost.org/trac/boost/ticket/4644 –

Questions connexes