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

时间:2012-08-06 06:46:22

标签: c++ performance templates casting static-members

我读到如果你试图将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有一个很好的答案,可以推荐并包含一个访客模式的例子。

4 个答案:

答案 0 :(得分:3)

您需要分析,但可能不是。尽管dynamic_cast有一些开销,但它已经过优化,并且在正确的实现中应该比任何用户实现的类型识别方法快得多。

然而,IMO,如果你需要大量演员表,你的设计可以改进。更好地问一下;)

此外,如果转换为指针,dynamic_cast不会返回NULL。

答案 1 :(得分:1)

我不确定你需要什么,但你可以看一下boost的多态转换 - polymorphic_castpolymorpihc_downcasthttp://www.boost.org/doc/libs/1_50_0/libs/conversion/cast.htm

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我认为dynamic_cast也会遍历继承层次结构,所以如果您按照自己的说法自行完成,则必须确保将来添加的任何新类添加到您的检查中这里。这似乎很容易,但非常容易出错,因为很容易忘记这些事情,任何新的开发人员都必须学习这一切。

也就是说,在性能方面,你将不得不描述,但我怀疑会有很多不同,因为动态演员中涉及的大部分间接都会被优化掉。