类型检查:查看变量是继承的还是某个类
Type Checking: see if a variable is inherited or is a certain class
我读到,如果您尝试将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_cast
和polymorpihc_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
也会遍历继承层次结构,所以如果您像前面所说的那样自己执行,则必须确保将来添加的任何新类都会添加到此处的检查中。这看起来很容易,但很容易出错,因为人们很容易忘记这些事情,任何新的开发人员都必须学习这一切。
也就是说,就性能而言,您必须进行概要分析,但我怀疑会有很大的差异,因为动态演员阵容中涉及的大多数间接内容都会被优化掉。
- 继承模板类中的类型别名
- 在运行时检查继承是否只有一种类型和 void*
- 如何正确消除继承类型定义的歧义?以及如何简化他们的创作?
- 如何从C 中的集合中检索多个继承类型
- 从模板继承<类型名 T、T 最大值、T 最小值>具有多个类型名模板参数的结构
- 继承类型的指针之间的静态强制转换
- 指向具有继承类型的类数据成员的指针
- 继承类型强制
- 可以从模板化的智能指针仅继承类型类吗
- 仅通过从其他类继承类型来定义类型
- 如果继承类型受到保护,我可以制作基类的指针以指向派生对象吗?
- std::tuple,按继承类型获取项
- 调用具有继承类型的基类函数
- 继承c++类型保护
- 如何在c++中更改继承类型的访问类型
- 二叉树,其中数据是不同的继承类型
- 继承类型定义
- 使用' void_t '检测多个继承类型重复错误
- 删除继承类型
- 构造函数在私有继承类型之外可用