C++ 11 中 std::is_base_of 的逻辑

Logic of std::is_base_of in C++ 11

在研究一些 C++ 概念时,我偶然发现了 std::is_base_of 逻辑。

谷歌搜索逻辑产生了以下代码,但我无法理解它。

有人可以向我解释一下它是如何工作的吗?

template<typename D, typename B>
class IsDerivedFromHelper
{
    class No { };
    class Yes { No no[3]; };

    static Yes Test( B* );
    static No Test( ... );
public:
    enum { Is = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };

};


template <class C, class P> 
bool IsDerivedFrom() {
    return IsDerivedFromHelper<C, P>::Is;
}

BD 的基础 class 时,调用 Test(static_cast<D*>(0)) 解析为 Yes Test(B*)。否则,它解析为 No Test(...).

如果 BD 的基数 class,则 sizeof(Test(static_cast<D*>(0))) 的值是 sizeof(Yes)。否则等于sizeof(No).

YesNo 的定义使得 sizeof(Yes) 永远不会等于 sizeof(No).

如果 BD 的基础 class,

sizeof(Test(static_cast<D*>(0))) == sizeof(Yes)

计算为 true。否则计算结果为 false.