Я нашел похожие вопросы и ответы, такие как этот . Однако, как я пробовал, эти тесты 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);
}