0

我读到dynamic_cast<THECLASS>(THEVARIABLE)如果您尝试将 THEVARIABLE 强制转换为 THECLASS(假设 THEVARIABLE 不是 THECLASS 的类而不是 THECLASS 的后代),它将返回 0。我听说 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

4 回答 4

3

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

但是,IMO,如果您需要大量演员表,则可以改进您的设计。最好问一下;)

此外,dynamic_cast如果您强制转换为指针,这不仅会返回 NULL。

于 2012-08-06T06:49:56.143 回答
1

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

于 2012-08-06T07:21:41.307 回答
1

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

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

于 2012-08-06T06:56:52.773 回答
0

我认为这也涉及dynamic_cast继承层次结构,所以如果你按照你所说的那样自己做,你必须确保将来添加的任何新类都被添加到你的检查中。这似乎很容易,但很容易出错,因为人们很容易忘记这些事情,任何从事此工作的新开发人员都必须学习所有这些。

也就是说,在性能方面,您将不得不进行分析,但我怀疑会有很多差异,因为动态转换中涉及的大多数间接都将被优化掉。

于 2012-08-06T07:01:24.983 回答