Maison >développement back-end >C++ >Comment détecter les fonctions membres héritées à l'aide de SFINAE en C ?
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!