了解 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;
}
这里有很多事情我没有搞清楚。将不胜感激。
我觉得IsDerivedFromHelper
定义了两个同名的静态成员(Test
)?这怎么可能?
类 No
和 Yes
都没有定义构造函数,这意味着它们只有默认的无参数构造函数。如果是这样,我们如何将 B*
(或 ...
)传递给 Test()
?
我理解 ...
表示可变参数。但是 - 在这种情况下这意味着什么?
同样,使用 D*
类型的参数实例化 Test
,其中 Test
的类型未定义构造函数。这是怎么回事?
- It seems to me that IsDerivedFromHelper defines two static members of the same name (Test)? How is this possible?
那些同名的成员函数有不同的参数列表。这称为函数重载。
- 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 类型对可以传递给它的参数没有影响。
- I understand that ... means variadic arguments. But - what does it mean in this situation?
可变参数。
- 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
被调用。根据模板类型参数,调用可能会解析为重载。
我在网上看到了下面这段代码。它本质上是为了说明一种实现 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
)?这怎么可能?类
No
和Yes
都没有定义构造函数,这意味着它们只有默认的无参数构造函数。如果是这样,我们如何将B*
(或...
)传递给Test()
?我理解
...
表示可变参数。但是 - 在这种情况下这意味着什么?同样,使用
D*
类型的参数实例化Test
,其中Test
的类型未定义构造函数。这是怎么回事?
- It seems to me that IsDerivedFromHelper defines two static members of the same name (Test)? How is this possible?
那些同名的成员函数有不同的参数列表。这称为函数重载。
- 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 类型对可以传递给它的参数没有影响。
- I understand that ... means variadic arguments. But - what does it mean in this situation?
可变参数。
- 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
被调用。根据模板类型参数,调用可能会解析为重载。