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;
}
当 B
是 D
的基础 class 时,调用 Test(static_cast<D*>(0))
解析为 Yes Test(B*)
。否则,它解析为 No Test(...)
.
如果 B
是 D
的基数 class,则 sizeof(Test(static_cast<D*>(0)))
的值是 sizeof(Yes)
。否则等于sizeof(No)
.
Yes
和 No
的定义使得 sizeof(Yes)
永远不会等于 sizeof(No)
.
如果 B
是 D
的基础 class,
sizeof(Test(static_cast<D*>(0))) == sizeof(Yes)
计算为 true
。否则计算结果为 false
.
在研究一些 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;
}
当 B
是 D
的基础 class 时,调用 Test(static_cast<D*>(0))
解析为 Yes Test(B*)
。否则,它解析为 No Test(...)
.
如果 B
是 D
的基数 class,则 sizeof(Test(static_cast<D*>(0)))
的值是 sizeof(Yes)
。否则等于sizeof(No)
.
Yes
和 No
的定义使得 sizeof(Yes)
永远不会等于 sizeof(No)
.
如果 B
是 D
的基础 class,
sizeof(Test(static_cast<D*>(0))) == sizeof(Yes)
计算为 true
。否则计算结果为 false
.