使用 shared_ptr 时为子类获取 type_info
Get type_info for subclass when using shared_ptr
我有以下最小示例代码。我希望能够在我的 Application::HandleEvent
方法中确定 Derived class。
应用程序 class 最终将包含一个 map
,它将 type_info
映射到处理程序函数(我知道如何使用 operator<
执行此操作)以将事件路由到他们的特定处理程序。
使用带有原始指针的多态性执行此操作没有问题,但如果 shared_ptr
s 被引入混合,我将无法执行此操作。
它总是报告 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";
我有以下最小示例代码。我希望能够在我的 Application::HandleEvent
方法中确定 Derived class。
应用程序 class 最终将包含一个 map
,它将 type_info
映射到处理程序函数(我知道如何使用 operator<
执行此操作)以将事件路由到他们的特定处理程序。
使用带有原始指针的多态性执行此操作没有问题,但如果 shared_ptr
s 被引入混合,我将无法执行此操作。
它总是报告 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";