Je le trouve assez utile, et il est assez bien ajustable pour de nombreuses tâches. Mais je dois admettre que je ne vois pas beaucoup de code CRTP dans la nature.
Est-ce difficile à saisir? Les fonctions virtuelles sont-elles globalement plus faciles? Ne devrait-il pas être utilisé dans 90% des cas où un mot-clé virtuel apparaît?
Le simple fait est que beaucoup, sinon la plupart, d'utilisateurs C ++ peuvent difficilement comprendre que vectorc'est mieux que mallocet free, donc le nombre de ceux qui peuvent non seulement apprécier mais implémenter la métaprogrammation avancée des modèles n'est pas très élevé. Cela implique que même si c'était bon pour 90% des situations, vous le verriez en beaucoup moins, simplement parce que les gens ne le savent pas ou comment l'utiliser.
Cependant, les fonctions virtuelles ne présentent des avantages, à savoir, les fonctions virtuelles sont beaucoup plus faciles à utiliser que le CRTP. Les modèles C ++ sont connus pour être gargouillis sur pratiquement tout et n'importe quoi, et le modèle d'inclusion est nul.
Cependant, ces [fonctions virtuelles] sont nettement plus lentes et moins puissantes. Par exemple, j'écris en ce moment du code en utilisant le CRTP, où vous héritez des surcharges d'opérateurs pour les utiliser avec les modèles d'expression. Il n'y a aucun moyen que les fonctions virtuelles puissent faire fonctionner cela.
N'est-il pas quelque peu ironique que la fonction même de langage que le CRTP utilise pour éviter l'utilisation de «virtuel» soit gargouillante sur «virtuellement» tout et n'importe quoi?
Kaiserludi
6
WTL utilise le CRTP. Le navigateur Chrome est un exemple bien connu de logiciel qui utilise WTL, donc je dirais qu'il est utilisé "à l'état sauvage".
Environ 90%? C'est certainement une surestimation. Avez-vous déjà utilisé un conteneur d'objets polymorphes? C'est une utilisation très courante du polymorphisme et vous ne pouvez pas le faire avec CRTP car ce Base<DerivedA>n'est pas la même chose que Base<DerivedB>.
Voici les raisons pour lesquelles il n'est pas utilisé plus largement:
C'est un hack
En tant que hack, il n'est pas garanti que vous n'ayez pas de problèmes lorsque vous l'utilisez. La substance OO normale a été utilisée par un grand nombre de projets et s'est révélée fonctionner correctement / les problèmes sont bien connus, le CRTP ne se trouve que dans un petit nombre de projets et aucune donnée n'est disponible.
il n'y a aucune bonne raison de l'utiliser - la plupart des raisons invoquées ne sont tout simplement pas valides
WTL utilise le CRTP. Le navigateur Chrome est un exemple bien connu de logiciel qui utilise WTL, donc je dirais qu'il est utilisé "à l'état sauvage".
Environ 90%? C'est certainement une surestimation. Avez-vous déjà utilisé un conteneur d'objets polymorphes? C'est une utilisation très courante du polymorphisme et vous ne pouvez pas le faire avec CRTP car ce
Base<DerivedA>
n'est pas la même chose queBase<DerivedB>
.la source
Voici les raisons pour lesquelles il n'est pas utilisé plus largement:
la source