类型检查:查看变量是继承的还是某个类

Type Checking: see if a variable is inherited or is a certain class

本文关键字:继承 类型 变量 检查      更新时间:2023-10-16

我读到,如果您尝试将THEVARIABLE强制转换为THECLASS,dynamic_cast<THECLASS>(THEVARIABLE)将返回0(假设THEVARIABLE不是THECLASS的类,也不是THECLASS的继承人)。我听说dynamic_cast比较慢,因为它需要进行运行时检查。如果我为对象检查做了很多循环,dynamic_cast不是很慢吗(比如100个对象)?

我想知道,如果我制作了一个静态类来进行以下类型检查,它会更好(更快?)(忽略语法错误,如果有的话):

class TYPECHECK {
public:
inline static bool isInt(int a) {
   return true;
}
template<typename wrongtype>
inline static bool isInt(wrongtype a) {
   return false;
}
[...]
private:
TYPECHECK();
};
int main() {
   int a = 5;
   char b = 'd';
   TYPECHECK::isInt(a);   //true
   TYPECHECK::isInt(b);   //false
   return 0; 
}

假设我这样做是为了除了int之外更复杂的类型。如果这个类在for循环中,它会比dynamic_cast(用于检查)更快吗?

提前谢谢。

编辑

twsansbury有一个很好的答案来推荐并包含访问者模式的示例。

您将需要进行配置文件,但可能不是。尽管dynamic_cast有一些开销,但它是经过优化的,并且在适当的实现中,应该比任何用户实现的类型识别方法都快得多。

然而,IMO,如果你需要大量的铸件,你的设计可以改进。最好问问这件事;)

另外,也不是说dynamic_cast只在强制转换为指针时返回NULL。

我不确定你需要它做什么,但你可以看看boost的多态类型转换-polymorphic_castpolymorpihc_downcast(http://www.boost.org/doc/libs/1_50_0/libs/conversion/cast.htm)

它们基本上执行与DEBUG中dynamic_cast和RELEASE中static_cast相同的操作,因此在DEBUG运行时具有安全性,在RELEASE运行时具有速度。

请记住,dynamic_cast的需要意味着架构的问题。想想虚拟方法。

我认为dynamic_cast也会遍历继承层次结构,所以如果您像前面所说的那样自己执行,则必须确保将来添加的任何新类都会添加到此处的检查中。这看起来很容易,但很容易出错,因为人们很容易忘记这些事情,任何新的开发人员都必须学习这一切。

也就是说,就性能而言,您必须进行概要分析,但我怀疑会有很大的差异,因为动态演员阵容中涉及的大多数间接内容都会被优化掉。