Maison > développement back-end > C++ > Comment pouvons-nous implémenter automatiquement un type de membre « self » en C ?

Comment pouvons-nous implémenter automatiquement un type de membre « self » en C ?

Mary-Kate Olsen
Libérer: 2024-12-07 21:39:13
original
463 Les gens l'ont consulté

How Can We Automatically Implement a `self` Member Type in C  ?

Implémentation autonome du type de membre self en C

C n'a pas de syntaxe explicite pour le mot-clé self tel qu'on le trouve en PHP, qui désigne le type de la classe englobante. Traditionnellement, ce comportement peut être émulé manuellement en définissant un alias typedef au sein de chaque classe :

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

Cependant, cette approche implique de répéter le nom de la classe, introduisant des risques potentiels de non-concordance et d'erreurs. Pour résoudre ce problème, une méthode alternative exploitant decltype et friends a été proposée :

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

Malheureusement, cette syntaxe n'est pas valide dans le contexte des définitions de classe.

Pour parvenir à une implémentation autonome de self , une approche plus sophistiquée est nécessaire. En utilisant la métaprogrammation de modèles, nous pouvons définir un modèle de classe Self qui encapsule le comportement de la classe tout en éliminant le besoin de réplication de type manuelle :

template <typename...Ts>
class Self;

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

Pour utiliser ce mécanisme, nous introduisons deux macros :

#define WITH_SELF(X) X : public Self<X>
#define WITH_SELF_DERIVED(X,...) X : public Self<X,__VA_ARGS__>
Copier après la connexion

En utilisant ces macros, nous pouvons définir des classes avec des types de membres autonomes :

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

Pour les classes dérivées, le La macro WITH_SELF_DERIVED permet l'héritage multiple :

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

Cette solution est compatible avec gcc 4.8 et clang 3.4, permettant une implémentation autonome du type de membre self en C sans avoir besoin de répétition explicite du nom de classe.

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