Bonsoir!

Je suis souvent confronté au même problème lorsque j'écris un parseur de texte. Là pour le coup, les éléments à traiter sont des chaines de caractères de la forme "cle=valeur", et ça me parait donc naturel d'utiliser le type std::map avec le design suivant:
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
#include <string>
#include <map>
 
 
class   MyClass
{
private:
   typedef bool (MyClass::t_callback*)(const std::string &data);
 
public:
   bool      Parse(const std::string &input);
 
private:
   bool      store_toto(const std::string &data);
   bool      store_tata(const std::string &data);
   bool      store_keke(const std::string &data);
 
private:
   std::map<std::string, t_callback>   _lookup;
};
Ensuite j'initialise le contenu de _lookup dans le constructeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
MyClass::MyClass()
{
   _lookup["toto"] = &MyClass::store_toto;
   _lookup["tata"] = &MyClass::store_tata;
   _lookup["keke"] = &MyClass::store_keke;
}
Comme ça dans la méthode Parse() tout est déja prêt pour sauter vers la bonne fonction selon la clé trouvée. Mais ça m'embête sur plusieurs points:
- _lookup est recréé & re-rempli à chaque instantiation
- chaque méthode store_machin() fait souvent une seule ligne, je trouve que c'est bourrin... mais en même temps je veux éviter les montagnes de if - else if au moment de parser

Il y a une solution plus propre que ça?
Merci