我很熟悉C++ RTTI,并且觉得这个概念很有趣。
尽管如此,滥用它的方式还是比正确使用它的方法多得多(RTTI-开关恐惧浮现在脑海中)。作为一名开发人员,我发现(并使用)它只有两个可行的用途(更确切地说,是一个半)。
您能分享一下RTTI是解决问题的可行方法吗?
注意:目的是让初级开发人员能够参考、批评和学习一个可行的示例库。
编辑:使用C++ RTTI在下面的代码中找到
// A has a virtual destructor (i.e. is polymorphic)
// B has a virtual destructor (i.e. is polymorphic)
// B does (or does not ... pick your poison) inherits from A
void doSomething(A * a)
{
// typeid()::name() returns the "name" of the object (not portable)
std::cout << "a is [" << typeid(*a).name() << "]"<< std::endl ;
// the dynamic_cast of a pointer to another will return NULL is
// the conversion is not possible
if(B * b = dynamic_cast<B *>(a))
{
std::cout << "a is b" << std::endl ;
}
else
{
std::cout << "a is NOT b" << std::endl ;
}
}发布于 2008-10-26 19:40:41
无环游客 (pdf)是一个很好的使用它。
发布于 2008-10-26 21:11:07
如何推动::任何物体!
这基本上使用RTTI信息来存储任何对象,而检索对象则使用boost::any_cast<>。
发布于 2008-10-26 21:47:33
您可以使用RTTI和dynamic_cast获得一个指向派生类的指针,以便使用它来调用快速、类型专门化的算法。它将进行直接和内联的调用,而不是通过基类使用虚拟方法。
这大大加快了我使用GCC的速度。Visual似乎没有那么好,它可能有一个较慢的dynamic_cast查找。
示例:
D* obj = dynamic_cast<D*>(base);
if (obj) {
for(unsigned i=0; i<1000; ++i)
f(obj->D::key(i));
}
} else {
for(unsigned i=0; i<1000; ++i)
f(base->key(i));
}
}https://stackoverflow.com/questions/238452
复制相似问题