我读到如果你试图将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有一个很好的答案,可以推荐并包含一个访客模式的例子。
答案 0 :(得分:3)
您需要分析,但可能不是。尽管dynamic_cast
有一些开销,但它已经过优化,并且在正确的实现中应该比任何用户实现的类型识别方法快得多。
此外,如果转换为指针,dynamic_cast
不会返回NULL。
答案 1 :(得分:1)
我不确定你需要什么,但你可以看一下boost的多态转换 - polymorphic_cast
和polymorpihc_downcast
(http://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
也会遍历继承层次结构,所以如果您按照自己的说法自行完成,则必须确保将来添加的任何新类添加到您的检查中这里。这似乎很容易,但非常容易出错,因为很容易忘记这些事情,任何新的开发人员都必须学习这一切。
也就是说,在性能方面,你将不得不描述,但我怀疑会有很多不同,因为动态演员中涉及的大部分间接都会被优化掉。