[英]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
的基类时,调用Test(static_cast<D*>(0))
解析为Yes Test(B*)
。 否则,它会解析为No Test(...)
。
如果B
是D
的基类,则sizeof(Test(static_cast<D*>(0)))
值为sizeof(Yes)
。 否则,它等于sizeof(No)
。
Yes
和No
被定义为sizeof(Yes)
永远不会等于sizeof(No)
。
如果B
是D
的基类,
sizeof(Test(static_cast<D*>(0))) == sizeof(Yes)
评估为true
。 否则它评估为false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.