Maison >développement back-end >C++ >Comment pouvons-nous implémenter un mot-clé autonome « Self » en C ?

Comment pouvons-nous implémenter un mot-clé autonome « Self » en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 15:05:11360parcourir

How Can We Implement an Autonomous

Self en C : L'implémentation autonome

Le mot-clé self, largement utilisé dans des langages comme PHP, pose un défi en C en raison de la absence de mécanisme équivalent. Bien qu'une implémentation spécifique à une classe utilisant des typedefs imbriqués soit simple, elle nécessite une duplication et risque d'introduire des bogues subtils. Cet article explore une solution élégante utilisant decltype et des modèles pour parvenir à une implémentation autonome autonome.

Déclaration de soi avec decltype

La tentative initiale d'introduction de soi à l'aide de decltype échoue car elle tente d'y accéder en dehors d'une instance. Pour résoudre ce problème, nous devons encapsuler l'auto-déclaration dans un modèle :

template <typename X, typename...Ts>
class SelfBase<X,Ts...>: public Ts...
{
protected:
    typedef X self;
};

Ce modèle sert de classe de base pour les types pouvant accéder à soi.

Macros pratiques

Pour simplifier l'utilisation de SelfBase, deux macros sont introduit :

  • WITH_SELF(X) : ajoute le SelfBase classe de base à X
  • WITH_SELF_DERIVED(X,...) : ajoute SelfBase comme classes de base à X

Exemples

En utilisant ces macros, nous pouvons maintenant définir des classes avec self :

class WITH_SELF(Foo)
{
    void test()
    {
        self foo; // self is now available
    }
};

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

Conclusion

En tirant parti de cltype et des templates, il est possible de mettre en place un système autonome type de membre autonome en C . Cette approche permet l'utilisation de soi au sein des classes sans risque de bugs silencieux dus à une redéfinition défectueuse des classes. Les macros pratiques fournies rendent la mise en œuvre simple et flexible, permettant l'héritage de plusieurs classes de base et différentes combinaisons de classes de base autonomes et régulières.

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