Или, как вариант:
template <class T, class I> struct is_iface_supported : std::false_type
{
};
class A
{
};
class B
{
};
class C : public A
{
};
template <> struct is_iface_supported <C, A> : std::true_type
{
};
class D : public B
{
};
template <> struct is_iface_supported <D, B> : std::true_type
{
};
class E : public A, public B
{
};
template <> struct is_iface_supported <E, A> : std::true_type
{
};
template <> struct is_iface_supported <E, B> : std::true_type
{
};
int main()
{
A a;
B b;
C c;
D d;
E e;
if (is_iface_supported<decltype(c), A>::value) puts("c is support interface A");
if (is_iface_supported<decltype(c), B>::value) puts("c is support interface B");
if (is_iface_supported<decltype(d), A>::value) puts("d is support interface A");
if (is_iface_supported<decltype(d), B>::value) puts("d is support interface B");
if (is_iface_supported<decltype(e), A>::value) puts("e is support interface A");
if (is_iface_supported<decltype(e), B>::value) puts("e is support interface B");
return 0;
}