在C ++中使用RTTI

时间:2013-09-03 10:36:08

标签: c++ rtti

C ++中运行时类型识别的用途是什么?我知道它是如何使用的,它提供了什么设施但是在C ++中引入RTTI的动机是什么?任何人都可以提供一个必须使用RTTI的小例子吗?

3 个答案:

答案 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