C++ 中运行时类型识别有什么用?我知道它是如何使用的以及它提供了哪些工具,但是在 C++ 中引入 RTTI 的动机是什么?谁能举一个必须使用RTTI的小例子?
问问题
3175 次
3 回答
1
您可以在检查后期条件时使用它:
class Clonable
{
virtual Clonable* doClone() const = 0;
public:
Clonable* clone() const
{
Clonable* results = doClone();
assert( typeid(*results) == typeid(*this) );
return results;
}
};
它也可以用作工厂函数映射的索引:在 C++11 中,您可以std::type_index
使用它来包装它;在早期版本中,您编写了自己的:
std::map<std::type_index, Base* (*)()> factoryMap;
然而,没有指定的输出这一事实std::type_info::name()
限制了它的效用,这远远超出了人们想要的程度。
于 2013-09-03T10:45:56.660 回答
1
这是一个例子:有时你会想要(虽然你应该避免)向下转换多态对象。在许多情况下,您在编译时不知道每次执行此转换是否有效:
struct Base { virtual ~Base() {} };
struct A : Base {};
struct B : Base {};
void foo(Base * base)
{
A * a = dynamic_cast<A *>(base); // RTTI magic here!
if(a != nullptr)
{
// do something with a
}
}
请注意,RTTI 是以运行时检查和性能损失为代价的,但如果您熟悉这个概念,您可能已经知道这一点。
于 2013-09-03T10:42:09.040 回答
0
boost::any 是一个很好的例子,它可以容纳不同的类型(参见: http: //www.boost.org/doc/libs/1_54_0/doc/html/any.html和http://www的源代码.boost.org/doc/libs/1_54_0/boost/any.hpp)
于 2013-09-03T10:41:51.347 回答