Можно ли проверить, определена ли функция-член для класса, даже если этот член унаследован от неизвестного базового класса

Я нашел похожие вопросы и ответы, такие как этот . Однако, как я пробовал, эти тесты SFINAE были успешными только в том случае, если тестируемый член был непосредственно определен в тестируемом классе. Например, следующий класс B, D1печатает HAS, а два других печатают NOT HAS. Есть ли способ определить, что если у класса есть член, определяется ли он сам по себе или базовый класс, и имя базового класса в этом случае неизвестно. Мотивация в том, что я хочу написать дженерик-функцию, которая будет вызывать некий метод, если он существует (из базы или нет, тип параметра дженерик, оставить по типу его возможную базу).

#include 

class HasFoo
{
    public :

    typedef char Small;
    typedef struct {char; char;} Large;

    template  class SFINAE {};

    template  static Small test (SFINAE *)
    {
        std::cout << "HAS" << std::endl;
    }

    template  static Large test (...)
    {
        std::cout << "NOT HAS" << std::endl;
    }
};

class B
{
    public :

    void foo () {}
};

class D1 : public B
{
    public :

    void foo () {} // overide
};

class D2 : public B
{
    public :

    using B::foo;
};

class D3 : public B {};

int main ()
{
    HasFoo::test(0);
    HasFoo::test(0);
    HasFoo::test(0);
    HasFoo::test(0);
}

5
задан Community 23 May 2017 в 12:31
поделиться