2010-09-01 7 views
15

¿Cómo se va a especificar opciones cortas sin sus contrapartes largas en boost?Opciones cortas solo en boost :: program_options

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

genera este

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

Cualquier forma de especificar únicas opciones cortas?

+0

¿Desea que el texto de ayuda deshabilite solamente las opciones abreviadas? –

+1

No, solo deseo opciones como -v en lugar de --verbose o definir ambas. Especificar ", v" en lugar de "v" hace el truco, pero revoca la lista de impresión de la descripción. – Novikov

Respuesta

15

Si está utilizando el analizador de línea de comandos, hay una manera de establecer diferentes estilos. Por lo tanto, la solución sería usar solo opciones largas y habilitar el estilo allow_long_disguise, que permite especificar opciones largas con un solo guión (es decir, "-long_option"). He aquí un ejemplo:

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

Habrá un pequeño problema con la salida Descripción embargo:

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

Y que uno es difícil de solucionar, porque esto es lo que se utiliza para formar esta salida:

std::string 
option_description::format_name() const 
{ 
    if (!m_short_name.empty()) 
     return string(m_short_name).append(" [ --"). 
     append(m_long_name).append(" ]"); 
    else 
     return string("--").append(m_long_name); 
} 

La única solución para esto que viene a la mente es reemplazar "-" con "-" en la cadena resultante. Por ejemplo:

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

Lo mejor que puede hacer es fijar el código donde se imprime vacío descripción de la opción de largo y enviar un parche para el autor de la biblioteca.

+0

Muy perspicaz, gracias! – Novikov

+1

@Novikov De nada. FYI - Acabo de crear un ticket para su problema y reparé parcialmente esa función format_name(). Ver https://svn.boost.org/trac/boost/ticket/4644 –

Cuestiones relacionadas