Ceci �tant dit, si tu travailles sur base d'une �num�ration (reprenons l'id�e des seules fonction trigono, par facilit�) proche deLe fait de travailler avec une classe prenant, pour la cause, une forme proche de
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7 enum WichFunction{ sinus, cosinus, tangeante, /* ...*/ MAX // TRES important, tu verras pourquoi ensuite };Alors, je sens que tu vas m'objecter que c'est sensiblement la m�me chose que d'avoir un switch, qu'il soit dans le constructeur ou dans la fonction... Sauf que :
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 class Algo{ /* je suis un gros fade, j'ai horreur de me répéter sur des noms de type trop complexes */ using tab_t = std::vector<double (*) (double>; /* quitte à ne pas respecter l'OCP, respectons le SRP */ static tab_t const & allFunctions(){ static const tab_t funcs{&std::sin &std::cos, &std::tan /*, ... */}; /* on se permet d'engueuler l'implémenteur si le nombre de fonctions indiquées * ne correspond pas au nombre de valeur énumérées */ assert(funcs.size() == MAX && "Implementor!!! Please do your job !!!"); return funcs; } public: /* chaque fois que l'on veut utiliser l'algorithme, il faut préciser la fonction qui sera utilisée */ Algo(WichFunction f):f_{f}{ /* L'utilisateur est un imbécile distrait qui pourrait nous servir un Algo bad(static_cast<WichFunction>(127); */ assert(f< MAX && "bad function requested"); } double exec(double d) const{ return allFunctions()[f_](d); } }
1- D'un point de vue conceptuel, on se rajoute un garde fous: on ne peut pas ajouter une valeur �num�r�e (avant MAX, ca va de soi) ou une fonction sans rajouter son pendant de "l'autre cot�".
J'aurais, bien sur, pr�f�r� une erreur de compilation, � ce sujet, ce qui devrait �tre possible, vu que les valeurs �num�r�s sont des constantes de compilation, mais, si tu oublies l'un des deux, le premier test qui utilisera Algo te rappellera � l'ordre
Bien sur, tu pourrais demander au compilateur de te lancer un avertissement sur les valeurs �num�r�es absentes de ton switch... case, mais, qui s'en inqui�terait
2- Sans pr�juger le moins du monde des optimisations que peut faire le compilateur sur un switch ... case, l'utilisation d'un tableau limite l'action � ... un d�callage d'adresse dans le tableau, sans test pour savoir quelle valeur nous int�resse.
Toi qui veut des performances, tu sera servi, car � ce titre, tu ne trouveras sans doute pas mieux (m�me si un bench correct est n�cessaire pour confirmer cette assertion)
3- Quitte � ne pas respecter l'OCP (car je peux admettre que ce ne soit pas toujours possible), je limite au maximum la prot�e de ce non respect.
J'aurais d'ailleurs pu en faire une fonction libre qui ne soit pas d�clar�e dans le header, et qui serait juste pr�sente dans le fichier d'impl�mentation, mais j'aurais perdu les possibilit�s d'inlining![]()
Partager