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
Libérer: 2024-12-30 08:55:09
original
350 Les gens l'ont consulté

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;
Copier après la connexion

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)
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal