【发布时间】:2021-02-10 11:56:20
【问题描述】:
我目前正在尝试实现一个事件系统,其中层可以订阅某些事件类型。我正在为回调方法的函数指针而苦苦挣扎。在 layer.h 文件中,我有 OnEvent 函数和一个函数指针,如下所示:
void OnEvent(const Event& e);
void(Engine::Layer::*m_EventCallback)(const Event& e);
在层的构造函数中我只是这样做:
m_EventCallback = OnEvent;
为了跟踪哪个层订阅了哪个 EventType,我定义了一个结构作为 folling:
struct CallbackData {
EventType type;
void(Engine::Layer::*OnEvent)(const Event& e);
int layerID;
bool isActive;
};
我有一个 EventDispatcher,它的调度函数看起来像这样:
bool EventDispatcher::Dispatch(const Event& e)
{
for (CallbackData& calldata : m_Callbacks) {
if (calldata.type == e.GetEventType() && calldata.isActive) {
calldata.OnEvent(e);
}
}
//TODO work on this so it only returns true if the event has been properly dispatched
return true;
}
还有一个 subscribe 函数,它创建一个 CallbackData 实例并将其推送到一个如下所示的向量中:
void EventDispatcher::Subscribe(EventType type, void(Engine::Layer::*OnEvent)
(const Event& e), int layerID)
{
CallbackData temp = { type, OnEvent, layerID, true };
m_CallbackInsert = m_Callbacks.emplace(m_CallbackInsert, temp);
}
因此,如果回调数据的类型与事件引用类型相同,则应通过函数指针调用 OnEvent 函数。 函数指针定义需要有 Engine:: 这只是一个命名空间和 Layer 是 OnEvent 所在的类。我不知道为什么它需要命名空间,因为我在这里所做的一切都是在命名空间中定义的。 但主要问题是如何正确定义函数指针,然后按照此处展示的方式调用它?
确切的错误信息是这样的:
expression preceding parentheses of apparent call must have(pointer-to-)function type
请不要将网站与已实施的事件系统链接。我已经看过那些,并没有真正了解多少。这就是为什么我想自己做,所以我理解它。
提前致谢!
【问题讨论】:
-
获取成员指针的语法是
&ClassName::MemberName。没有像函数指针那样的隐式转换。 -
你还需要一个
Layer的实例来调用函数。指向成员的指针不属于特定实例,但必须相对于对象取消引用。 -
在 CallbackData 结构中添加一个 Layer 指针然后接收该层指针的函数指针是否有意义?
标签: c++ events callback function-pointers