template <typename T, typename U> class IsSubclass {
typedef char YesType;
struct NoType {
char padding[8];
};
static YesType subclassCheck(U*);
static NoType subclassCheck(...);
static T* t;
public:
static const bool value = sizeof(subclassCheck(t)) == sizeof(YesType);
};
为什么填充数组的大小应该是8而不是其他大小?
我想知道使用8的原因
1条答案
按热度按时间yeotifhr1#
这似乎是过时的代码。从C11开始,就有了
std::is_base_of
。而且,这种使用两个重载(返回类型为sizeof
)来编写类型trait的方法相当过时。我可以用一个完整的答案来解释如何编写这样的类型trait的历史和演变。但是,我认为这超出了本问题的范围。其工作原理如下:
T* t;
成员被传递给subclassCheck()
成员方法。t
可以隐式转换为U*
。当U
是T
的公共基类时就是这种情况。然后调用YesType subclassCheck(U*);
。如果
U
不是T
的公共基类,则t
不能转换为U*
,并且调用NoType subclassCheck(...);
。value
是将被调用成员函数的返回类型的大小与YesType
的大小进行比较的结果。如果它们匹配,您就知道调用了YesType subclassCheck(U*);
,并且T
继承自U
。由于sizeof
是未计算的上下文,因此实际上没有调用任何函数(这就是为什么只有声明,没有成员函数的定义是可以的)。这只在
sizeof(NoType)
与sizeof(YesType)
不同时起作用。只要sizeof(NoType)
与sizeof(char)
不同时,NoType
实际包含的内容是无关紧要的。有很多细节可以用更新的C标准来更新。
typedef
-〉using
.std::is_same
而不是使用sizeof
来比较类型。还有很多,但是整个方法已经过时了。而且,C++11引入了std::is_base_of
。