j'ai un problème je voudrais utiliser CRTP mais le problème du CRTP c'est qu'il faut passer un paramètre template à la classe mère parce que le type de this dans la classe mère est celui de la classe mère et pas moyen de récupérer le type de la classe fille avec le polymorphisme donc ceci ne compile pas.
class Mere {
public:
void testMere() {
std::cout<<"appeler la classe mère"<<std::endl;
static_cast<decltype(*this)>(*this).testFille();
}
};
class Fille : public Mere {
public :
void testFille() {
std::cout<<"appeller la classe fille"<<std::endl;
}
} int main() { Mere* mere = new Fille(); mere->testMere(); delete mere; }
Pour que ça compile il faut rendre la fonction template comme ceci :
template <typename D>
void testMere() {
std::cout<<"appeler la classe mère"<<std::endl;
static_cast<D*>(this)->testFille();
}
Hors, je ne connais pas toujours le type de D lors de l'appel de la fonction testMere en compilation surtout si il y a plusieurs classes filles et que je stocke tout dans un std::vector.
Le problème des fonctions virtuelles c'est qu'elles ralentissent le code à l'exécution de mon moteur de jeux, alors la seule solution que j'ai trouvé, c'est de changer tout le code et utiliser un système ECS.
C'est alors que quelqu'un m'a parlé de CRTP et du c++23 avec deducing this ma question est, est t'il possible de déduire le type réel du pointeur this en compilation pour éviter à devoir passer un paramètre template ?
Non, c'est pas possible, même avec deducing this ou le CRTP.
Dans le code donné en exemple dans l'article :
struct base {
template <class Self>
void f(this Self&& self);
};
struct derived : base {};
int main() {
derived my_derived;
my_derived.f();
}
Self est reconnu comme étant du type "derived" parce que c'est le type de "my_derived" dans "main". L'information sur le type existe à la compilation et donc le deducing this ne fait que DÉDUIRE le type (le principe est explicite dans le nom).
Si tu écris plusieurs classes enfants qui dérivent d'une base et que tu stockes ça dans un vector, tu est obligé d'avoir un vector de la classe de base et donc l'information sur le type réel d'un objet dans ton vector n'est pas disponible a la compilation.
> Le problème des fonctions virtuelles c'est qu'elles ralentissent le code à l'exécution de mon moteur de jeux
As-tu pu vérifier qu'elles étaient réellement ton bottleneck ?
Bah en utilisant le profiler je ne vois pas de fonctions dont le temps d'exécution est excessivement long, j'ai déjà optimiser en utilisant resize au lieu de push_back qui ralentissait avec un accès direct à mes std::vector plutôt qu'un accès séquentiel ce qui a optimiser déjà.
Maintenant reste plus qu'à optimiser j'ai garder l'optimisation pour la fin mais j'aurais peut être pas dû j'aurai du voir la conception dès le départ pour ne pas devoir recoder.
[c++23] CRTP et deducing this.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Si vous ne trouvez plus rien, cherchez autre chose.