CRTP : une alternative au polymorphisme dynamique
Le polymorphisme dynamique, tout en offrant de la flexibilité, peut souvent entraîner une surcharge d'exécution en raison de l'utilisation de ressources virtuelles fonctions membres. Heureusement, C offre une alternative efficace : Curiously Recurring Template Pattern (CRTP).
CRTP vous permet d'obtenir une répartition statique, similaire au polymorphisme, mais sans la surcharge des fonctions membres virtuelles. Ceci est accompli grâce à la spécialisation de type et à la déduction de modèles.
Méthode 1 : Spécification d'interface statique
En spécifiant l'interface de manière statique pour vos types dérivés, vous pouvez appliquer certains comportements à temps de compilation. Par exemple, considérons l'extrait de code suivant :
<code class="cpp">template <class Derived> struct base { void foo() { static_cast<Derived *>(this)->foo(); }; };</code>
Dans ce scénario, base<> nécessite que tout type dérivé définisse une fonction membre foo() pour la compilation. Chaque type dérivé, tel que my_type et your_type, doit implémenter sa propre fonction foo() pour répondre à cette exigence.
Méthode 2 : déduction de type au moment de la compilation
Alternativement , vous pouvez éviter d'utiliser des pointeurs ou des références à la classe de base et effectuer un câblage de type au moment de la compilation. Considérons la fonction modèle suivante :
<code class="cpp">template <class T> // T is deduced at compile-time void bar(base<T> &obj) { obj.foo(); // does static dispatch }</code>
Cette fonction accepte une référence à un objet de type base
Avantages du CRTP
En tirant parti du CRTP, vous pouvez obtenir un polymorphisme statique en C , évitant les inconvénients du polymorphisme dynamique tout en préservant les avantages de la conception orientée objet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!