c++ 为什么使用字符填充[8]

n7taea2i  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(162)
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的原因

yeotifhr

yeotifhr1#

这似乎是过时的代码。从C11开始,就有了std::is_base_of。而且,这种使用两个重载(返回类型为sizeof)来编写类型trait的方法相当过时。我可以用一个完整的答案来解释如何编写这样的类型trait的历史和演变。但是,我认为这超出了本问题的范围。
其工作原理如下:T* t;成员被传递给subclassCheck()成员方法。t可以隐式转换为U*。当UT的公共基类时就是这种情况。然后调用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

相关问题