2011-02-24 9 views
5

Estoy utilizando las opciones del programa boost para obtener valores booleanos del argumento de la línea de comandos. Me gustaría que mi argumento para especificar como "Y", Sí", 'N', 'No'.opciones booleanas de las opciones del programa boost

En realidad mi código lo hizo mediante una cadena temporal que

  1. será analizado por boost program options
  2. cotejarse con la "y", "Sí", "N" o "No"
  3. asignado al miembro variable booleana.

además de eso también estoy usando otra cadena temp obtener el valor por defecto

que lo hice todo el trabajo desde que traté de ti código de abajo que no funcionó

 namespace pod = boost::program_options; 

     ("Section.Flag", 
      pod::value<bool>(&myFlag_bool)->default_value(false), 
      "description") 

¿Sabe usted si las opciones del programa impulso se pueden utilizar algunos mejor que el que yo uso para lograr eso?

Respuesta

4

Vas a analizar una cadena de una manera u otra. Hay un par de opciones, la mayoría dependiendo de la frecuencia con la que va a consultar este valor. Aquí hay un ejemplo de algo similar a lo que utilicé recientemente; CopyConstructable y Asignable para que funcione bien con STL. Creo que tenía que hacer algunas cosas extra para conseguir que funcione con program_options, pero se obtiene lo esencial:

#include <boost/algorithm/string.hpp> 

class BooleanVar 
{ 
public: 
    BooleanVar(const string& str) 
     : value_(BooleanVar::FromString(str)) 
    { 
    }; 

    BooleanVar(bool value) 
     : value_(value) 
    { 
    }; 

    BooleanVar(const BooleanVar& booleanVar) 
     : value_(booleanVar) 
    { 
    }; 

    operator bool() 
    { 
     return value_; 
    }; 

    static bool FromString(const string& str) 
    { 
     if (str.empty()) { 
      return false; 
     } 

     // obviously you could use stricmp or strcasecmp(POSIX) etc if you do not use boost 
     // or even a heavier solution using iostreams and std::boolalpha etc 
     if (
      str == "1" 
      || boost::iequals(str, "y") 
      || boost::iequals(str, "yes") 
      || boost::iequals(str, "true") 
     ) 
     { 
      return true; 
     } 

     return false; 
    }; 

protected: 
    bool value_; 
}; 
+0

Gracias por la respuesta y para el uso de impulso :: iequals..I nunca pensó en ello . Saludos AFG –

+1

@Abruzzo si esta respuesta resolvió su pregunta, debería aceptarla. –

Cuestiones relacionadas