0

C++ 中运行时类型识别有什么用?我知道它是如何使用的以及它提供了哪些工具,但是在 C++ 中引入 RTTI 的动机是什么?谁能举一个必须使用RTTI的小例子?

4

3 回答 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 回答