c++ - 在 C++ 中实现可用回调的好方法

标签 c++ coding-style callback

我有一个用 C++ 编写的自定义菜单类。为了将代码分成易于阅读的函数,我使用了回调。

因为我不想将单例用作菜单的主机,所以我提供了另一个参数(目标),它将作为第一个参数提供给回调(针对缺少“this”引用的某种解决方法)。

注册-签名

AddItem(string s, void(*callback)(void*,MenuItem*), void* target = NULL)

注册示例

menu->AddItem(TRANSLATE, "translate", &MyApp::OnModeSelected);

处理程序示例

/* static */
void MyApp::OnModeSelected(void* that, MenuItem* item) {
    MyApp *self = (MyApp*)that;
    self->activeMode = item->text;
}

这种方法有什么不妥之处吗?有没有更好的?

最佳答案

您的方法要求回调函数是自由函数或类的静态成员。它不允许客户端使用成员函数作为回调。一种解决方案是使用 boost::function作为回调的类型:

typedef boost::function<void (MenuItem*)> callback_type;
AddItem(const std::string& s, const callback_type& callback = callback_type());

然后客户端可以使用 boost::bindboost::lambda传入回调:

menu->AddItem("Open", boost::bind(&MyClass::Open, this));

另一种选择是使用 boost::signals这允许多个回调注册同一事件。

关于c++ - 在 C++ 中实现可用回调的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378165/

相关文章:

python - 如何用C++重写Dlib的Python代码?

c++ - 在定义处初始化模板结构

c# - 在 C# 中使用 if (!bool) 与 if (bool == false)

c++ - 如何检测每行的多个语句?

javascript - 在调用它的函数的回调中使用参数

c++ - 无法使用带有 g++ 的 -std 标志进行编译

javascript - 嵌套 if 为 : is it better to use if (x) {statement;} or if (! x) return;陈述;

node.js - 在Node.js中使用try..catch进行错误处理

javascript - Nodejs/Javascript 回调使用 - 等待 API 调用

c++ - Premake4 实用程序和应用程序入口点