eventpp项目中的CallbackList使用完全指南
什么是CallbackList
CallbackList是eventpp库中提供的一个强大工具,用于管理和执行回调函数序列。它本质上是一个回调函数的容器,允许开发者以有序的方式添加、移除和触发多个回调函数。这种机制在事件处理、消息传递和观察者模式等场景中非常有用。
基础用法
创建CallbackList
首先需要创建一个CallbackList实例,并指定回调函数的原型:
eventpp::CallbackList<void ()> callbackList;
这里的模板参数void ()
表示回调函数不需要参数且没有返回值。你可以根据需要定义任何函数原型。
添加回调函数
使用append
方法添加回调函数:
callbackList.append([](){
std::cout << "回调函数1" << std::endl;
});
callbackList.append([](){
std::cout << "回调函数2" << std::endl;
});
回调函数可以是lambda表达式、普通函数、函数对象等任何可调用对象。
触发回调
直接调用CallbackList对象即可触发所有回调函数:
callbackList();
回调函数会按照添加的顺序依次执行。
带参数的回调
CallbackList支持带参数的回调函数:
eventpp::CallbackList<void (const std::string &, int)> callbackList;
callbackList.append([](const std::string &s, int i) {
std::cout << "字符串: " << s << ", 整数: " << i << std::endl;
});
触发时需要传入相应参数:
callbackList("测试", 42);
回调函数管理
移除回调函数
每个append
操作会返回一个句柄(Handle),可用于后续移除回调:
auto handle = callbackList.append([](){ /*...*/ });
// 移除回调
callbackList.remove(handle);
遍历回调函数
CallbackList提供了forEach
方法用于遍历所有回调函数:
callbackList.forEach([](const auto &callback) {
// 处理每个回调函数
});
也可以在遍历时获取句柄:
callbackList.forEach([](const auto &handle, const auto &callback) {
// 可以基于handle进行操作
});
高级特性
回调函数原型兼容性
CallbackList具有灵活的类型兼容性,回调函数的参数类型不需要完全匹配:
eventpp::CallbackList<void (const std::string &)> callbackList;
// 可以接受const string&参数的回调
callbackList.append([](const std::string &s) { /*...*/ });
// 也可以接受string值拷贝的回调
callbackList.append([](std::string s) { /*...*/ });
线程安全考虑
默认情况下CallbackList不是线程安全的。如果需要在多线程环境下使用,需要自行添加同步机制。
实际应用场景
CallbackList非常适合以下场景:
- 事件通知系统
- 插件架构中的扩展点
- 观察者模式实现
- 需要动态添加/移除处理函数的场合
性能考虑
CallbackList经过优化,具有较高的性能:
- 回调触发操作的时间复杂度为O(n),n为回调函数数量
- 添加/移除操作的时间复杂度通常为O(1)
- 内部使用高效的数据结构存储回调函数
总结
eventpp的CallbackList提供了一个灵活而强大的回调管理机制,通过本教程,你应该已经掌握了:
- 如何创建和配置CallbackList
- 添加和移除回调函数的方法
- 触发回调函数的技巧
- 高级遍历和管理功能
CallbackList是eventpp库的核心组件之一,熟练掌握它将大大提升你在事件驱动编程中的效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考