C ++中运行时类型识别的用途是什么?我知道它是如何使用的,它提供了什么设施但是在C ++中引入RTTI的动机是什么?任何人都可以提供一个必须使用RTTI的小例子吗?
答案 0 :(得分: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是以运行时检查和性能损失为代价的,但是如果您熟悉这个概念,您可能已经知道了。
答案 1 :(得分: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()
的输出不是。{
但是,规定的限制了它的实用性
等。
答案 2 :(得分: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)