Maison > développement back-end > C++ > Comment puis-je obtenir un auto-référencement dans les classes C sans répéter le nom de la classe ?

Comment puis-je obtenir un auto-référencement dans les classes C sans répéter le nom de la classe ?

Mary-Kate Olsen
Libérer: 2024-12-03 14:35:14
original
210 Les gens l'ont consulté

How Can I Achieve Self-Referencing in C   Classes Without Repeating the Class Name?

Classes auto-référentes en C sans répétition

Le C n'offre pas d'équivalent au mot-clé self de PHP, qui représente le type de l'englobant classe. Pour l'émuler pour une classe spécifique, on peut définir :

struct Foo { typedef Foo self; };
Copier après la connexion

Cependant, cela nécessite de répéter le nom de la classe, laissant la place à des bugs silencieux. Existe-t-il un moyen « autonome » d'y parvenir en utilisant decltype et Friends ?

La syntaxe suivante échoue en raison d'une utilisation non valide de celle-ci au niveau supérieur :

struct Foo { typedef decltype(*this) self; };
Copier après la connexion

Une solution consiste à introduire un classe de modèle Self comme suit :

template <typename... Ts>
class Self;

template <typename X, typename... Ts>
class Self<X, Ts...> : public Ts... {
  typedef X self;
};
Copier après la connexion

Les macros peuvent ensuite être utilisées pour simplifier la classe définitions :

#define WITH_SELF(X) X : public Self<X>
#define WITH_SELF_DERIVED(X, ...) X : public Self<X, __VA_ARGS__>

class WITH_SELF(Foo) {
  void test() { self foo; }
};
Copier après la connexion

Les dérivations peuvent être gérées avec :

class WITH_SELF_DERIVED(Bar, Foo) {
  /* ... */
};
Copier après la connexion

L'héritage multiple et les macros variadiques permettent une intégration facile avec des hiérarchies de classes complexes :

class WITH_SELF(Foo2) { /* ... */ };

class WITH_SELF_DERIVED(Bar2, Foo, Foo2) {
  /* ... */
};
Copier après la connexion

Cette technique a été testé et vérifié avec GCC 4.8 et Clang 3.4.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal