C++ 回调?我应该使用成员函数指针/委托(delegate)/事件吗?

标签 c++ events delegates callback handler

我正在进入一个对我来说是新的领域,但基本上我需要在 C++ 中实现回调。我正在为自己设计一个工具包,用来简化我的生活。基本上它是一个 .dll 插件,它将向我的其他 .dll 插件公开很多功能。

其中一个函数是 HookEvent(const char *event_name, void *callback),它允许我 Hook 被触发的不同事件。这是一个例子...

Example_Plugin1.dll 执行 HookEvent("player_spawn", &Plugin1::Event_PlayerSpawn); Example_Plugin2.dll 执行 HookEvent("player_spawn", &Plugin2::Event_PlayerSpawn);

我需要找出设置回调系统的最佳(最好是最简单的)方法,该系统对此非常有效。我已经阅读 C++ 回调几个小时了,发现了很多不同的方法。

我认为最简单的事情就是制作一个模板,并使用 typedef bool (ClassName::*EventHookCallback)(IGameEvent, bool);听完之后,我就有点云里雾里了。

我还了解到,委托(delegate)或 .NET 风格的事件系统是其他可能的方法。我已经有点困惑了,所以我不想让自己更加困惑,但认为这是值得问的。

这里是我正在阅读的 C++ .NET 风格事件系统的链接。 http://cratonica.wordpress.com/2010/02/19/implementing-c-net-events-in-c/

那么你们有什么建议呢?任何有关实现的提示将不胜感激。

最佳答案

如果你想要通用事件触发 Boost.Signals2可能适用。

The Boost.Signals2 library is an implementation of a managed signals and slots system. Signals represent callbacks with multiple targets, and are also called publishers or events in similar systems. Signals are connected to some set of slots, which are callback receivers (also called event targets or subscribers), which are called when the signal is "emitted."

即使您不需要这种级别的灵活性,您也应该能够使用 Boost.Bind 简化代码中的函数绑定(bind)。 ,或 C++0x 等效项。

编辑: Herb Sutter 对您可能面临的问题进行了精彩的讨论 here 。如果您决定不需要完整的 Boost 功能集,则可以使用此指南作为指导,并自行推出。

关于C++ 回调?我应该使用成员函数指针/委托(delegate)/事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4268829/

相关文章:

ios - 委托(delegate) ivar 解释

c++ - 柠檬 + re2c 没有得到正确的规则解析

c++ - 在 C++ 中如何有效地使用类中的方法?

java - 鼠标拖动画线组滞后的原因

vba - 微软 Access 2010 : Prevent Save in Main Form On Move to Subform

c# - 为什么 Func<> 委托(delegate)的这个 MSDN 示例有一个多余的 Select() 调用?

java - 使用Java修改exe资源?

C++如何在函数的一行中读取更多整数?

JavaScript 无法检测鼠标滚轮事件

ios - Xcode 7 中没有类型或协议(protocol)命名错误如何解决?