这不是一个整体的概念,而是它用来确定一个类是否具有n
数据成员的方法之一。这是完整的代码;SFINAE 用于成员检测的普通用途。
template <typename T>
struct has_X {
struct Fallback { int X; };
struct Derived : T, Fallback {};
template <typename U, U> struct S;
template <typename C> static char (&f(S<int Fallback::*, &C::X> *))[1];
template <typename C> static char (&f(...))[2];
public:
const static bool value = sizeof(f<Derived>(0)) == 2;
};
Derived
继承自两者Fallback
的部分让T
我感到困惑,因为当我们对 , 进行重载时f
,&C::X
是&Derived::X
. 但是不应该总是选择这个重载,因为不能Derived
保证有,X
因为它继承自Fallback
哪个数据成员?
也许我忽略了一些东西。然而,这段代码向我展示并教会了我从未知道的东西,所以也许这有一些东西。我期望的是始终选择该重载(而不是带有 的重载...
),因为它Derived
应该始终具有X
,因为它继承自Fallback
. 但这种情况并非如此。有人可以解释为什么吗?