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!