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 :
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&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value << endl; // 1 (true) std::cout << has_serialize<Y, int(const std::string&)>::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!