繁体   English   中英

了解 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 )的 static 成员? 这怎么可能?

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

  3. 我知道...表示可变参数 arguments。 但是——在这种情况下是什么意思?

  4. 同样,使用D*类型的参数实例化Test ,其中Test的类型没有定义构造函数。 这里发生了什么?

  1. 在我看来 IsDerivedFromHelper 定义了两个同名的 static 成员(测试)? 这怎么可能?

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

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

function 的返回类型对可以传入什么参数没有影响。

  1. 我明白......意味着可变参数 arguments。 但是——在这种情况下是什么意思?

可变参数 arguments。

  1. 同样,使用 D* 类型的参数实例化 Test,其中 Test 的类型没有定义构造函数。

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

这里发生了什么?

调用成员 function Test 根据模板类型 arguments,调用可能会解析为任一过载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM