了解 std::is_base_of 的重新实现

Understanding a reimplementation of std::is_base_of

我在网上看到了下面这段代码。它本质上是为了说明一种实现 std::is_base_of 的方法(可能不准确)。

我添加了带编号的评论以将行与下面提出的特定问题相关联:

#include <type_traits>
#include <iostream>

class Q {};

class Z : public Q {};

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

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

};

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

int main(int argc, char** argv) {
    std::cout << IsDerivedFrom<Z, Q>() << std::endl;

    return 0;
}

这里有很多事情我没有搞清楚。将不胜感激。

  1. 我觉得IsDerivedFromHelper定义了两个同名的静态成员(Test)?这怎么可能?

  2. NoYes 都没有定义构造函数,这意味着它们只有默认的无参数构造函数。如果是这样,我们如何将 B*(或 ...)传递给 Test()

  3. 我理解 ... 表示可变参数。但是 - 在这种情况下这意味着什么?

  4. 同样,使用 D* 类型的参数实例化 Test,其中 Test 的类型未定义构造函数。这是怎么回事?

  1. It seems to me that IsDerivedFromHelper defines two static members of the same name (Test)? How is this possible?

那些同名的成员函数有不同的参数列表。这称为函数重载。

  1. The classes No and Yes both define no constructor, meaning they only have the default no-arguments constructor. If so, how are we able to pass B* (or ...) to Test()?

函数的 return 类型对可以传递给它的参数没有影响。

  1. I understand that ... means variadic arguments. But - what does it mean in this situation?

可变参数。

  1. Again, instantiating Test with an argument of type D* where the type of Test doesn't define a constructor.

函数是调用,而不是实例化。函数没有构造函数。

What is going on here?

成员函数Test被调用。根据模板类型参数,调用可能会解析为重载。