使用 shared_ptr 时为子类获取 type_info

Get type_info for subclass when using shared_ptr

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

应用程序 class 最终将包含一个 map,它将 type_info 映射到处理程序函数(我知道如何使用 operator< 执行此操作)以将事件路由到他们的特定处理程序。

使用带有原始指针的多态性执行此操作没有问题,但如果 shared_ptrs 被引入混合,我将无法执行此操作。

它总是报告 type_info 是基数 class,我是否使用 shared_ptr 的 type_info(智能指针是不多态相关)或指向 class 的 type_info 使用 .get().

这可能吗?我不是在寻找一种解决方案,即我在事件 subclass 本身中定义处理程序方法。

#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);
}

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

而不是

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

使用

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