我有以下最小的示例代码。我希望能够在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);
}
答案 0 :(得分:2)
在指针上使用typeid
时,您将获得有关指针的信息,而不是基础对象的信息。要获取有关与多态指针对应的基础对象的信息,请使用引用,即取消引用指针
而不是
std::cout << typeid(e.get()).name() << "\n";
使用
std::cout << typeid(*e).name() << "\n";