C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C类型比较:typeid vs double dispatch dynamic_cast大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
是否存在任何性能或稳健性原因而不是优先于另一个

#include <iostream>
#include <typeinfo>

struct B
{
    virtual bool IsType(B const * b) const { return IsType2nd(b) && b->IsType2nd(this); }
    virtual bool IsType2nd(B const * b) const { return dynamic_cast<decltype(this)>(b) != nullptr; }
};

struct D0 : B
{
    virtual bool IsType(B const * b) const { return IsType2nd(b) && b->IsType2nd(this); }
    virtual bool IsType2nd(B const * b) const { return dynamic_cast<decltype(this)>(b) != nullptr; }
};

struct D1 : B
{
    virtual bool IsType(B const * b) const { return IsType2nd(b) && b->IsType2nd(this); }
    virtual bool IsType2nd(B const * b) const { return dynamic_cast<decltype(this)>(b) != nullptr; }
};

int main()
{
    using namespace std;
    B b,bb;
    D0 d0,dd0;
    D1 d1,dd1;

    cout << "type B  == type B  : " << (b.IsType(&bb)   ? "true " : "false") << endl;
    cout << "type B  == type D0 : " << (b.IsType(&dd0)  ? "true " : "false") << endl;
    cout << "type B  == type D1 : " << (b.IsType(&dd1)  ? "true " : "false") << endl;
    cout << "type D0 == type B  : " << (d0.IsType(&bb)  ? "true " : "false") << endl;
    cout << "type D0 == type D0 : " << (d0.IsType(&dd0) ? "true " : "false") << endl;
    cout << "type D0 == type D1 : " << (d0.IsType(&dd1) ? "true " : "false") << endl;
    cout << "type D1 == type B  : " << (d1.IsType(&bb)  ? "true " : "false") << endl;
    cout << "type D1 == type D0 : " << (d1.IsType(&dd0) ? "true " : "false") << endl;
    cout << "type D1 == type D1 : " << (d1.IsType(&dd1) ? "true " : "false") << endl;
    cout << endl;
    cout << "type B  == type B  : " << (typEID(b) == typEID(bb)   ? "true " : "false") << endl;
    cout << "type B  == type D0 : " << (typEID(b) == typEID(dd0)  ? "true " : "false") << endl;
    cout << "type B  == type D1 : " << (typEID(b) == typEID(dd1)  ? "true " : "false") << endl;
    cout << "type D0 == type B  : " << (typEID(d0) == typEID(&bb) ? "true " : "false") << endl;
    cout << "type D0 == type D0 : " << (typEID(d0) == typEID(dd0) ? "true " : "false") << endl;
    cout << "type D0 == type D1 : " << (typEID(d0) == typEID(dd1) ? "true " : "false") << endl;
    cout << "type D1 == type B  : " << (typEID(d1) == typEID(bb)  ? "true " : "false") << endl;
    cout << "type D1 == type D0 : " << (typEID(d1) == typEID(dd0) ? "true " : "false") << endl;
    cout << "type D1 == type D1 : " << (typEID(d1) == typEID(dd1) ? "true " : "false") << endl;
}

输出

type B  == type B  : true 
type B  == type D0 : false
type B  == type D1 : false
type D0 == type B  : false
type D0 == type D0 : true 
type D0 == type D1 : false
type D1 == type B  : false
type D1 == type D0 : false
type D1 == type D1 : true 

type B  == type B  : true 
type B  == type D0 : false
type B  == type D1 : false
type D0 == type B  : false
type D0 == type D0 : true 
type D0 == type D1 : false
type D1 == type B  : false
type D1 == type D0 : false
type D1 == type D1 : true

解决方法

从设计角度来看,双重调度更加灵活:

>目前,您检查类型与IsType2nd(b)&&的严格因素. B-> IsType2nd(本).但可能在某个时候你想进一步衍生出来
>但是有一天你可能想要进一步推导出D1,但仍然想把它当作比较类型的D1对象.这种特殊情况很容易通过双重调度完成.

这种灵活性是有代价的:汇编程序代码将通过vtable使用2个间接调用,以及动态强制转换.

直接类型信息并不是最好的设计,正如谢尔盖所​​指出的那样:它将始终是一种严格的类型比较,没有特殊情况可能.

这种不灵活性有利于代码生成的简单性:代码只需要在vtable的开头@L_618_9@动态类型信息(并且编译器可以很容易地优化这种类型在编译时已知类型的对象.

为了好奇,这里some code generated:他的typEID在编译时被优化掉了,而double displatch仍然依赖于间接调用.

@H_197_35@

大佬总结

以上是大佬教程为你收集整理的C类型比较:typeid vs double dispatch dynamic_cast全部内容,希望文章能够帮你解决C类型比较:typeid vs double dispatch dynamic_cast所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。