Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-11-06 00:36:02470parcourir

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>

Sortie :

true
true
false

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!

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