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
Mary-Kate Olsenoriginal
2024-12-03 14:35:14302parcourir

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; };

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; };

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;
};

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; }
};

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

class WITH_SELF_DERIVED(Bar, Foo) {
  /* ... */
};

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) {
  /* ... */
};

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!

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