Maison > développement back-end > C++ > Comment les traits de type C 11 peuvent-ils détecter la présence d'une fonction membre avec une signature spécifique ?

Comment les traits de type C 11 peuvent-ils détecter la présence d'une fonction membre avec une signature spécifique ?

Mary-Kate Olsen
Libérer: 2024-12-26 22:59:10
original
940 Les gens l'ont consulté

How Can C  11 Type Traits Detect the Presence of a Member Function with a Specific Signature?

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

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&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value; // prints 1
Copier après la connexion

Dans l'exemple ci-dessus, has_serialize::value évaluera également à true car l'héritage préserve la signature de la fonction. Cette fonctionnalité constitue un avantage clé par rapport à la solution présentée dans le fil de discussion d'origine.

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