[英]Explanation on Member Detection code
它不是整个概念,而是用于确定类是否具有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
。 但这种情况并非如此。 有人可以解释一下原因吗?
Fallback
有一个名为X
数据成员,但如果T
还有一个名为X
的成员,则Derived会有两个 ,在这种情况下, Derived::X
不能明确地获取。 因此,如果T
没有X
,则使用第一个重载,如果T
具有X
,则使用第二个更通用的版本。 这就是为什么你可以根据返回类型的大小来区分这些情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.