SFINAE pour vérifier hérité des fonctions de membre du

À l'aide de SFINAE, je peut détecter si une classe donnée a une certaine fonction de membre. Mais que faire si je veux tester hérité des fonctions de membre?

Le code suivant ne fonctionne pas dans VC8 et GCC4 (c'est à dire détecte que A a une fonction membre foo(), mais pas que B hérite de la):

#include <iostream>

template<typename T, typename Sig>                                 
struct has_foo {                     
    template <typename U, U> struct type_check;
    template <typename V> static char (& chk(type_check<Sig, &V::foo>*))[1];
    template <typename  > static char (& chk(...))[2]; 
    static bool const value = (sizeof(chk<T>(0)) == 1);
};

struct A {
    void foo();
};

struct B : A {};

int main()
{
    using namespace std;
    cout << boolalpha << has_foo<A, void (A::*)()>::value << endl; //true
    cout << boolalpha << has_foo<B, void (B::*)()>::value << endl; //false
}

Alors, est-il un moyen de tester hérité des fonctions de membre?

  • Je ne pense pas que ce soit possible en général. Jusqu'à présent, de toutes façons je l'ai vu avoir certains cas où ils ne parviennent pas.