Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
std::is#u base#u在C++;11 当我通过一些C++概念时,我偶然发现STD::逻辑的ISSUBASEX。< /P>_C++_C++11_Std - Fatal编程技术网

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