Bonjour à tous,
Je souhaite rajouter des unités à une classe, cependant, je ne vois toujours pas comment le faire sans impacter les performances/maintenabilité du code. Imaginons que j'ai une classe comme ceci :
Et que je vais lui donner une unité (un booléen qui me dit si je suis dans le monde réel ou sur l'écran par exemple). Le plus simple serait de faire cela (c'est ce que j'ai trouvé sur internet notamment).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 struct MaClasse { MaClasse f(const MaClasse&); };
Le problème avec ce code, c'est que si "f" est grosse, le compilateur ne va pas l'inliner et va générer deux instances de f (dommage, puisque f est strictement identique dans les deux cas). De plus, ça m'oblige à mettre la définition de f en dehors d'un .cpp.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<bool WorldView> struct MaClasse { MaClasse f(const MaClasse&); };
Une autre solution que j'ai envisagé est :
La, on résout les deux problèmes normalement. Le problème, c'est que j'ai du code qui ne sert à rien... ce qui rend le tout plus contraignant à maintenir si MaClasseBase change.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 struct MaClasseBase { MaClasseBase f(const MaClasseBase& ); }; template<bool WorldView> struct MaClasse : private MaClasseBase { inline MaClasse f(const MaClasse& c){return MaClasseBase::f(c);} private : MaClasse(const MaClasseBase& n) : MaClasse(n){} };
Avez-vous une idée pour résoudre ce problème (j'ai aussi pensé au CRTP, mais le problème, c'est que la classe de base devient template, donc ça n'apporte rien) ?
Merci pour votre aide
PS : J'ai le même problème avec une classe B qui souhaite étendre A mais en faisant que les fonctions qui renvoient des A renvoient des B. Utiliser le CRTP pour résoudre le problème pose les mêmes problèmes que la première solution il me semble. Si jamais cette question n'est pas naturellement résolue par la question d'au dessus, j'ouvrirai un nouveau thread.
Partager