使用shared_ptr时获取子类的type_info

时间:2015-03-27 04:43:59

标签: c++ boost polymorphism shared-ptr typeinfo

我有以下最小的示例代码。我希望能够在Application::HandleEvent方法中确定Derived类。

Application类最终将包含map,它将type_info映射到处理函数(我知道如何使用operator<)将事件路由到其特定处理程序。

使用带有原始指针的多态性这样做是没有问题的,但是如果shared_ptr被混合使用,我就无法做到这一点。

它始终报告type_info是基类的类型,我是否使用shared_ptr的type_info(智能指针与多态相关并不是一个大惊喜)或指向的type_info使用.get()的课程。

这可能吗?我没有寻找一种解决方案,我在事件子类本身中定义了一个处理程序方法。

#include <typeinfo>
#include <iostream>

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

class Event
{
    public:
    virtual ~Event(){};
};

class SpecificEvent1 : public Event
{};

class SpecificEvent2 : public Event
{};

class Application
{
    public: 
    void HandleEvent(boost::shared_ptr<Event> e)
    {
        std::cout << typeid(e.get()).name() << "\n";
        std::cout << typeid(e).name() << "\n";
    }
};

int main(int, char**)
{
    Application app;

    boost::shared_ptr<SpecificEvent1> se1 = boost::make_shared<SpecificEvent1>();
    boost::shared_ptr<SpecificEvent2> se2 = boost::make_shared<SpecificEvent2>();

    app.HandleEvent(se1);
    app.HandleEvent(se2);
}

1 个答案:

答案 0 :(得分:2)

在指针上使用typeid时,您将获得有关指针的信息,而不是基础对象的信息。要获取有关与多态指针对应的基础对象的信息,请使用引用,即取消引用指针

而不是

std::cout << typeid(e.get()).name() << "\n";

使用

std::cout << typeid(*e).name() << "\n";