Détection de la présence de fonctions de membres à l'aide des traits de type C 11
Question :
Comment pouvons-nous déterminer si une classe possède une fonction membre avec une signature spécifique sans exiger que la classe la fournisse ça ?
Élaboration du dilemme :
Le problème se pose lorsque nous devons effectuer des opérations personnalisées basées sur la présence ou l'absence d'une fonction membre particulière dans une classe. Contrairement aux cas où la classe doit fournir la fonction, nous recherchons une méthode pour discerner son existence pour le traitement conditionnel. La solution idéale évite l'écrasement des fonctions globales, les invocations excessives de pile et les déclarations d'espace de noms intrusives.
Solution basée sur un modèle :
En utilisant les traits de type C 11, nous pouvons concevoir un fonction de modèle qui vérifie l'existence de la cible function :
template<typename C, typename Ret, typename... Args> struct has_serialize { // Assertion to prevent instantiation with non-function arguments static_assert( std::integral_constant<T, false>::value, "Second template parameter needs to be of function type." ); // Specialization to perform the check private: template<typename T> static constexpr auto check(T*) -> typename std::is_same< decltype( std::declval<T>().serialize( std::declval<Args>()... ) ), Ret // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >::type; // attempt to call it and see if the return type is correct template<typename> static constexpr std::false_type check(...); typedef decltype(check<C>(0)) type; public: static constexpr bool value = type::value; };
Utilisation :
Nous pouvons désormais utiliser le modèle has_serialize pour vérifier l'existence d'une fonction au sein d'une classe :
struct X { int serialize(const std::string&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value; // prints 1
Dans l'exemple ci-dessus, has_serialize
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!