[英]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;
}
这里有很多事情我没有弄清楚。 协助将不胜感激。
在我看来, IsDerivedFromHelper
定义了两个同名( Test
)的 static 成员? 这怎么可能?
No
和Yes
类都没有定义构造函数,这意味着它们只有默认的无参数构造函数。 如果是这样,我们如何能够将B*
(或...
)传递给Test()
?
我知道...
表示可变参数 arguments。 但是——在这种情况下是什么意思?
同样,使用D*
类型的参数实例化Test
,其中Test
的类型没有定义构造函数。 这里发生了什么?
- 在我看来 IsDerivedFromHelper 定义了两个同名的 static 成员(测试)? 这怎么可能?
那些同名的成员函数有不同的参数列表。 这称为 function 过载。
- No 和 Yes 类都没有定义构造函数,这意味着它们只有默认的无参数构造函数。 如果是这样,我们如何将 B*(或...)传递给 Test()?
function 的返回类型对可以传入什么参数没有影响。
- 我明白......意味着可变参数 arguments。 但是——在这种情况下是什么意思?
可变参数 arguments。
- 同样,使用 D* 类型的参数实例化 Test,其中 Test 的类型没有定义构造函数。
调用function,而不是实例化。 函数没有构造函数。
这里发生了什么?
调用成员 function Test
。 根据模板类型 arguments,调用可能会解析为任一过载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.