C类型比较:typeid vs double dispatch dynamic_cast
发布时间:2020-12-16 07:15:30 所属栏目:百科 来源:网络整理
导读:是否存在任何性能或稳健性原因而不是优先于另一个? #include iostream#include typeinfostruct B{ virtual bool IsType(B const * b) const { return IsType2nd(b) b-IsType2nd(this); } virtual bool IsType2nd(B const * b) const { return dynamic_castd
是否存在任何性能或稳健性原因而不是优先于另一个?
#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(本).但可能在某个时候你想进一步衍生出来 这种灵活性是有代价的:汇编程序代码将通过vtable使用2个间接调用,以及动态强制转换. 直接类型信息并不是最好的设计,正如谢尔盖所??指出的那样:它将始终是一种严格的类型比较,没有特殊情况可能. 这种不灵活性有利于代码生成的简单性:代码只需要在vtable的开头获取动态类型信息(并且编译器可以很容易地优化这种类型在编译时已知类型的对象. 为了好奇,这里some code generated:他的typeid在编译时被优化掉了,而double displatch仍然依赖于间接调用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容