Maison  >  Article  >  développement back-end  >  Comment le modèle de modèle curieusement récurrent (CRTP) permet-il d'obtenir un polymorphisme statique en C ?

Comment le modèle de modèle curieusement récurrent (CRTP) permet-il d'obtenir un polymorphisme statique en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-27 05:48:02754parcourir

How Does Curiously Recurring Template Pattern (CRTP) Achieve Static Polymorphism in C  ?

Éviter le polymorphisme d'exécution avec CRTP

En C , l'utilisation de fonctions membres virtuelles introduit une surcharge supplémentaire au moment de l'exécution. CRTP (Curiously Recurring Template Pattern) présente une approche alternative pour éviter cette surcharge tout en préservant le polymorphisme.

Il existe deux méthodes pour utiliser CRTP pour atteindre cet objectif.

Spécialisation de type statique

La première méthode consiste à définir l'interface de manière statique pour la structure des types. Ceci est réalisé en créant une classe de modèle de base avec une fonction membre virtuelle. Les classes dérivées peuvent ensuite instancier cette classe modèle et implémenter la fonction membre virtuelle :

<code class="cpp">template <class Derived>
struct Base {
  virtual void foo() {}
};

struct MyType : Base<MyType> {
  void foo() override;
};

struct YourType : Base<YourType> {
  void foo() override;
};</code>

Répartition statique via déduction de type au moment de la compilation

La deuxième méthode évite l'utilisation d'idiomes de référence à la base ou de pointeur vers la base. Au lieu de cela, le câblage est établi au moment de la compilation via des fonctions de modèle qui déduisent le type au moment de l'exécution :

<code class="cpp">template <class T>
void bar(Base<T>& obj) {
  obj.foo();
}</code>

En utilisant cette méthode, seules les classes dérivées de Base peuvent être transmises à bar. Cela permet la répartition statique et élimine la surcharge associée aux fonctions membres virtuelles :

<code class="cpp">bar(MyType()); // Calls MyType::foo()
bar(YourType()); // Calls YourType::foo()</code>

En conclusion, CRTP offre un mécanisme puissant pour réaliser un polymorphisme statique en C . En spécialisant l'interface pour la structure de type ou en effectuant une répartition statique via la déduction de type au moment de la compilation, les développeurs peuvent éviter la surcharge d'exécution des fonctions membres virtuelles tout en conservant la flexibilité du polymorphisme.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn