std::is#u base#u在C++;11 当我通过一些C++概念时,我偶然发现STD::逻辑的ISSUBASEX。< /P>
在谷歌上搜索产生以下代码的逻辑,但我无法理解它 有人能给我解释一下它是怎么工作的吗std::is#u base#u在C++;11 当我通过一些C++概念时,我偶然发现STD::逻辑的ISSUBASEX。< /P>,c++,c++11,std,C++,C++11,Std,在谷歌上搜索产生以下代码的逻辑,但我无法理解它 有人能给我解释一下它是怎么工作的吗 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(sta
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;
}
模板
类IsDerivedFromHelper
{
第{}类;
类是{否[3];};
静态是测试(B*);
静态无试验(…);
公众:
枚举{Is=sizeof(Test(static_cast(0))==sizeof(Yes)};
};
模板
布尔是从()派生出来的{
返回IsDerivedFromHelper::Is;
}
当B
是D
的基类时,调用Test(static_cast(0))
解析为yestest(B*)
。否则,它将解析为无测试(…)
如果B
是D
的基类,则sizeof(Test(static_cast(0))
的值为sizeof(Yes)
。否则,它等于sizeof(No)
Yes
和No
的定义使得sizeof(Yes)
永远不会等于sizeof(No)
如果B
是D
的基类
sizeof(Test(static_cast<D*>(0))) == sizeof(Yes)
sizeof(Test(static_cast(0))==sizeof(Yes)
计算结果为
true
。否则它的计算结果为false
@KerrekSB上面的SFINAE在哪里?@Barry链接的问题是解释不同的代码。它们都是对is_base_of
的尝试,但是链接的一个看起来解决了私有继承问题,而(据我猜测)上面的一个没有(因此更简单)。Neeraj,你想知道是如何用语言实现的,还是想知道你发布的代码是如何工作的?@KerrekSB:是吗?在我看来,这是基本的过载解决方案D*
隐式转换为B*
iif(ish)B
是D
的基础。该重载返回一个类型为Yes
的值,其大小是No
的三倍,您可以使用sizeof
进行测试。所有其他情况都会导致调用…
重载,该重载返回否
。蛋糕上的锦上添花是,整个东西都在一个未赋值的上下文中,所以实际上没有调用任何东西,整个东西可以用作编译时常量。@Yakk是的,但是为什么是的基础工作的逻辑也解释了为什么这个也工作-它只是更复杂。@Barry,我不同意重复部分。另一个问题有非常不同的代码。谢谢R Sahu。当然,我在这里遗漏了一些基本知识。在static_cast操作符中传递的0(表达式)的角色是什么?@Neeraj它是一个老派nullptr