IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Boost Program_options option sous forme d'enum


Sujet :

Boost C++

  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut Boost Program_options option sous forme d'enum
    Bonjour,

    Mon problème est le suivant : je voudrais parser les options d'un programmes à l'aide de boost::program_options.

    Pour les options de type entier : aucun problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Help : 
    tailleDuBuffer arg : taille du buffer en octets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ligne de commande
    tailleDuBuffer=42
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code : 
    boost::program_options::value<int>()

    Pour les options de type entier : aucun problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Help : 
    FichierDeLog arg : nom du fichier de log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ligne de commande
    FichierDeLog="toto.log"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code : 
    boost::program_options::value<std::string>()
    Maintenant, ce que je voudrais faire, c'est ajouter une option avec des paramètres fixés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Help : 
    TypeDeBuffer (fixe|variable) : Type de buffer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ligne de commande
    TypeDeBuffer=fixe
    Je voudrais que l'utilisateur puisse spécifier : "fixe" ou "variable", mais par exemple pas "Tartalacreme"

    Je n'ai rien trouvé par défaut pour faire cela. Alors que cela me semble être une option de base. Dans le doute, je vais faire mon propre type d'option, mais cela me semble lourd pour gérer un tel cas.

    Est-ce que quelqu'un a déjà eu à faire cela ?

    Merci à ceux qui ont lu.
    Merci à ceux qui pourront m'aider.

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Bon, en attendant une solution plus standard, j'ai bricolé un validator.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    // This class contains the value of the parsed option
    // It also contains the map from string to enum used to know wich is wich
    template<typename Enum>
    struct EnumOption
    {
    public:
        EnumOption(const Enum& newValue) : value(newValue) {}
        Enum value;
        static std::map<std::string, Enum> param_map;
    };
     
    template<typename Enum>
    std::map<std::string, Enum> EnumOption<Enum>::param_map;
     
    // This method is used to validate and parse the string and find the right enum
    template<typename Enum>
    void validate(boost::any& value,
                  const std::vector<std::string>& values,
                  EnumOption<Enum>*, int)
    {
        boost::program_options::validators::check_first_occurrence(value);
        const std::string& valueAsString = boost::program_options::validators::get_single_string(values);
     
        typename std::map<std::string,Enum>::const_iterator it = EnumOption<Enum>::param_map.find( valueAsString );
        if ( it == EnumOption<Enum>::param_map.end() )
        {
            throw boost::program_options::validation_error("invalid value");
        }
        else
        {
            value = boost::any(EnumOption<Enum>(it->second));
        }
    }

    ça s'utilise comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        enum MyEnum
        {
            Toto,Titi
        };
        EnumOption<MyEnum>::param_map["Toto"] = Toto;
        EnumOption<MyEnum>::param_map["Titi"] = Titi;
     
        ...
     
        boost::program_options::options_description desc("Yop !");
        desc.add_options()
            ("paramName", boost::program_options::value<EnumOption<MyEnum> >(), "yep !")
        ;
     
        ...
     
        MyEnum result = vm["paramName"].as<EnumOption<MyEnum> >().value;

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/10/2012, 18h07
  2. [Smarty] Afficher les données d'une BDD sous forme de tableau avec options
    Par student_php dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 05/10/2010, 17h29
  3. Réponses: 2
    Dernier message: 12/12/2007, 09h47
  4. groupe option et sous form
    Par Renardo dans le forum Access
    Réponses: 1
    Dernier message: 27/06/2006, 20h51
  5. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo