Maison > développement back-end > C++ > Comment détecter les fonctions membres héritées à l'aide de SFINAE en C ?

Comment détecter les fonctions membres héritées à l'aide de SFINAE en C ?

DDD
Libérer: 2024-11-06 00:36:02
original
559 Les gens l'ont consulté

How to Detect Inherited Member Functions Using SFINAE in C  ?

Utilisation de SFINAE pour vérifier les fonctions membres héritées

SFINAE (Substitution Failure Is Not An Error) est une technique puissante en C qui permet d'évaluer les expressions au moment de la compilation. . Il peut être utilisé pour détecter la présence de fonctions membres, y compris celles héritées.

Le code suivant illustre une approche pour tester les fonctions membres héritées :

<code class="cpp">#include <iostream>

template<typename Type>
class has_foo
{
    class yes { char m; };
    class no { yes m[2]; };
    struct BaseMixin
    {
        void foo() {}
    };
    struct Base : public Type, public BaseMixin {};
    template<typename T, T t> class Helper {};
    template<typename U>
    static no deduce(U*, Helper<void(BaseMixin::*)(), &U::foo>* = 0);
    static yes deduce(...);
public:
    static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0)));
};

struct A
{
    void foo();
};

struct B : A {};

struct C {};

int main()
{
    using namespace std;
    cout << boolalpha << has_foo<A>::result << endl;
    cout << boolalpha << has_foo<B>::result << endl;
    cout << boolalpha << has_foo<C>::result;
}</code>
Copier après la connexion

Sortie :

true
true
false
Copier après la connexion

Cette approche utilise la dérivation de classe et la métaprogrammation de modèles pour déterminer si un type donné hérite d'une méthode. La classe BaseMixin définit la méthode souhaitée et la classe Base sert de type intermédiaire dérivé à la fois du type cible et de BaseMixin. Cela permet d'utiliser SFINAE pour déduire si la méthode existe sur le type cible.

La classe has_foo utilise ensuite cette déduction pour fournir une constante de compilation indiquant si la méthode est présente. Cela permet d'obtenir un code efficace et extensible qui peut ajuster dynamiquement son comportement en fonction de la présence ou de l'absence de fonctions membres héritées.

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