RTTI在C++中的应用

Use of RTTI in C++

本文关键字:应用 C++ RTTI      更新时间:2023-10-16

C++中运行时类型标识有什么用途?我知道它是如何使用的,它提供了什么功能,但在C++中引入RTTI的动机是什么?有人能举一个必须使用RTTI的小例子吗?

这里有一个例子:有时你会想要(尽管你应该避免)向下转换多态对象。在许多情况下,您在编译时不知道每次执行此强制转换时是否有效:

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是以运行时检查和性能损失为代价的,但如果您熟悉这个概念,您可能已经知道了。

您可以在检查后条件时使用它:

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()的输出不是然而,指定限制了它的效用喜欢

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)