Maison >développement back-end >C++ >Comment puis-je vérifier si une classe C a une fonction membre avec une signature spécifique ?

Comment puis-je vérifier si une classe C a une fonction membre avec une signature spécifique ?

DDD
DDDoriginal
2024-12-30 08:55:09385parcourir

How Can I Check if a C   Class Has a Member Function with a Specific Signature?

Vérification de l'existence d'une fonction membre avec une signature personnalisée

Dans cet article, nous abordons le défi de déterminer si une classe C possède une fonction membre spécifique avec une signature spécifiée. Contrairement à la question abordée dans le livre de Scott Meyers, le but ici est de faire la distinction entre les classes possédant et dépourvues de la fonction.

Template Trick

Pour y parvenir, nous introduisons une astuce de modèle qui exploite les fonctionnalités de C 11. La structure du modèle has_serialize sert de modèle principal et affirme que le deuxième paramètre du modèle doit être un type de fonction.

Spécialisation pour la vérification des fonctions

Une spécialisation du modèle has_serialize gère la vérification réelle de la fonction. Il utilise deux fonctions de modèle :

  • check : tente d'appeler la méthode spécifiée sur un objet factice et vérifie le type de retour par rapport au type attendu.
  • type : détermine si le type de retour de la fonction de vérification correspond au type attendu.

Fonction Vérification

Pour tester l'existence d'une fonction particulière f(Args...) avec signature Ret(Args...) en classe C :

std::cout << has_serialize<C, Ret(Args...)>::value << endl;

Exemple d'utilisation

Dans l'exemple suivant, nous définissons deux classes, X et Y, où Y hérite de X. La classe X a une fonction membre Serialize(const std::string&) qui renvoie un int.

En utilisant le modèle has_serialize, nous pouvons vérifier que X et Y possèdent tous deux la fonction Serialize avec la signature correcte :

struct X {
     int serialize(const std::string&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value << endl; // 1 (true)
std::cout << has_serialize<Y, int(const std::string&amp;)>::value << endl; // 1 (true)

Cela montre comment l'astuce du modèle has_serialize peut détecter efficacement si une classe contient une fonction membre spécifique d'un élément donné. signature.

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