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:
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
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; };
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:
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; }
- _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![]()
Partager