Maison >développement back-end >C++ >Comment pouvons-nous implémenter automatiquement un type de membre « self » en 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; };
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; };
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; };
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__>
En utilisant ces macros, nous pouvons définir des classes avec des types de membres autonomes :
class WITH_SELF(Foo) { void test() { self foo; } };
Pour les classes dérivées, le La macro WITH_SELF_DERIVED permet l'héritage multiple :
class WITH_SELF_DERIVED(Bar,Foo) { /* ... */ };
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!