首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >相当于java的instanceof的C++

相当于java的instanceof的C++
EN

Stack Overflow用户
提问于 2009-02-01 09:32:49
回答 2查看 180.3K关注 0票数 219

要实现与java的instanceof等效的C++,首选的方法是什么

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-01 09:34:34

尝试使用:

代码语言:javascript
复制
if(NewType* v = dynamic_cast<NewType*>(old)) {
   // old was safely casted to NewType
   v->doSomething();
}

这要求您的编译器启用rtti支持。

编辑:我对这个答案有一些很好的评论!

每次需要使用dynamic_cast (或instanceof)时,最好问问自己这是否是必要的。这通常是一个糟糕的设计的标志。

典型的变通方法是将您正在检查的类的特殊行为放入基类的虚函数中,或者可能引入类似visitor的东西,在这种情况下,您可以为子类引入特定行为,而无需更改接口(当然,添加访问者接受接口除外)。

正如所指出的,dynamic_cast不是免费的。处理大多数(但不是所有情况)的简单且一致的hack基本上是添加一个枚举,表示您的类可以拥有的所有可能的类型,并检查您是否获得了正确的类型。

代码语言:javascript
复制
if(old->getType() == BOX) {
   Box* box = static_cast<Box*>(old);
   // Do something box specific
}

这不是一个好的面向对象设计,但它可以是一种变通方法,它的成本或多或少只是一个虚拟函数调用。无论是否启用RTTI,它都可以正常工作。

请注意,这种方法不支持多级继承,因此如果您不小心,您可能会得到如下所示的代码:

代码语言:javascript
复制
// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
   Box* box = static_cast<Box*>(old);
   // Do something box specific
}
票数 211
EN

Stack Overflow用户

发布于 2013-09-25 14:58:05

代码语言:javascript
复制
#include <iostream.h>
#include<typeinfo.h>

template<class T>
void fun(T a)
{
  if(typeid(T) == typeid(int))
  {
     //Do something
     cout<<"int";
  }
  else if(typeid(T) == typeid(float))
  {
     //Do Something else
     cout<<"float";
  }
}

void main()
 {
      fun(23);
      fun(90.67f);
 }
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/500493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档