class Event
{
public:
virtual std::string getEventType()
{
return typeid(*this).name();
}
}
class NotWorkEvent
{
public:
virtual std::string getEventType()
{
return typeid(this).name();
}
};
struct EventCallBak
{
long funcId_;
EventConsumeFunc func_;
};
class EventBus
{
public:
EventBus()
: callbackId_(0)
{}
void publish(std::shared_ptr<Event> event)
{
std::lock_guard<std::recursive_mutex> lock(mutex_);
for (auto msgCb : callbackMap_)
{
if (event->getEventType() == msgCb.first)
{
for (EventCallBak cb : msgCb.second)
{
cb.func_(event);
}
}
}
}
template<typename T>
long registerHandler(EventConsumeFunc func)
{
std::string type = typeid(T).name();
std::lock_guard<std::recursive_mutex> lockGuard(mutex_);
EventCallBak cb;
cb.funcId_ = callbackId_++;
cb.func_ = func;
auto it = callbackMap_.find(type);
if (it == callbackMap_.end())
{
std::vector<EventCallBak> cbs;
cbs.push_back(cb);
callbackMap_[type] = cbs;
}
else
{
it->second.push_back(cb);
}
return cb.funcId_;
}
std::map<std::string, std::vector<EventCallBak>> callbackMap_;
mutable std::recursive_mutex mutex_;
long callbackId_;
};下面是测试代码:
class AnEvent : public Event
{
};
std::shared_ptr<EventBus> eventBus = std::make_shared<EventBus>();
int eventCaller = eventBus_->registerHandler<AnEvent>(
[&](std::shared_ptr<Event> event)
{
std::shared_ptr<AnEvent> typedEvent = std::dynamic_pointer_cast<AnEvent>(event);
EXPECT_TRUE(typedEvent != nullptr);
});测试结果:
如果将事件定义为“事件”类,则
我的问题是:
1. typeid(*this)、typeid(this)和typeid(varname)之间有什么区别?
2.模板和typeid(*this)中的typeid(T).name()返回的值(除用于任何编译器和.name版本之外)是否相同?
发布于 2020-12-04 07:48:51
1. typeid(*this)、typeid(this)和typeid(varname)之间有什么区别?
*this是对对象的lvalue引用,this是指向对象的指针。在引用上应用typeid时,可以获得引用对象的动态类型的类型信息(如果该类型是动态的)。在指针上应用typeid时,可以获得指针类型的类型信息。
2.由typeid(T).name()返回的相同值(用于任何编译器和C++版本)
不是的。名称是定义的实现,不同语言实现的名称是不同的。
https://stackoverflow.com/questions/65138898
复制相似问题