Maison >développement back-end >C++ >Ma classe a-t-elle cette fonction de membre ?

Ma classe a-t-elle cette fonction de membre ?

DDD
DDDoriginal
2024-12-21 08:20:11422parcourir

Does My Class Have This Member Function?

Vérification d'une fonction de membre de classe d'une signature donnée

Considérez le défi de vérifier si une classe possède une fonction de membre spécifique d'un prédéterminé signature. Bien qu'il soit lié au concept abordé dans Effective C Third Edition de Scott Meyers, ce problème nécessite une solution distincte.

Le problème et l'exigence

Contrairement au scénario de Meyers où assurer l'existence d'une fonction membre est cruciale pour la compilation, cette situation nécessite une approche flexible. L'objectif est de faire la distinction entre les classes qui implémentent la fonction membre souhaitée et celles qui ne le font pas, déclenchant différentes actions en conséquence.

Une solution modèle

C 11 fournit un modèle qui détecte efficacement les fonctions membres, même celles héritées. L'implémentation fournie s'appuie sur le trait is_same pour vérifier la compatibilité des types de retour :

#include <type_traits>

// Check member function presence and return type correctness
template<typename C, typename Ret, typename... Args>
struct has_serialize {
    static constexpr bool value =
        std::is_same<
            decltype( std::declval<T>().serialize( std::declval<Args>()... ) ),
            Ret
        >::type::value;
};

Usage

Pour utiliser cette approche, spécifiez simplement la classe à vérifier, ainsi avec le type de retour et les arguments de la fonction membre :

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

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

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