CallbackNotify.hpp
#pragma once #include <map> template <typename Func> class CallbackNotify { private: CallbackNotify(const CallbackNotify&) = delete; // 禁用复制函数 CallbackNotify& operator= (const CallbackNotify&) = delete; // 禁用赋值构造 int m_observerId = 0; // 观察者对应的编号 std::map<int, Func> m_connections; // 观察者列表 // 保存观察者并分配观察者编号 template <typename F> int Assign(F&& f) { int k = m_observerId++; m_connections.emplace(k, std::forward<F>(f)); return k; } public: CallbackNotify() = default;// 使用C++11提供的默认构造函数 virtual ~CallbackNotify() { m_connections.clear(); m_observerId = 0; } // 注册观察者,支持右值引用 int Connect(Func&& f) { return Assign(f); } // 移除观察者 void Disconnect(int key) { m_connections.erase(key); } // 通知所有观察者 template <typename... Args> void Notify(Args&&... args) { for (auto& it : m_connections) { it.second(std::forward<Args>(args)...); // 函数对象执行参数 } } };
测试:
#include <iostream> #include <string> #include <functional> #include "CallbackNotify.hpp" using namespace std; struct TestA { int a; int b; void print(int x, int y) { cout << "TestA print:" << x << "," << y << endl; } void printNoParam() { cout << "TestA printNoParam:" << a << "," << b << endl; } }; void printLocal(int a, int b) { cout << "printLocal:" << a << "," << b << endl; } void test() { CallbackNotify<std::function<void(int, int)>> myevent; // 申明注册的函数对象是两个参数的int auto key1 = myevent.Connect(std::move(printLocal)); // 以函数方式注册观察者 TestA testA; auto key2 = myevent.Connect([&testA](int a, int b) {testA.a = a; testA.b = b; }); // lambda注册 auto key3 = myevent.Connect([](int a, int b) {cout << "lambda print:" << a << "," << b << endl; }); // lambda注册 // std::function注册 std::function<void(int, int)> f1 = std::bind(&TestA::print, &testA, std::placeholders::_1, std::placeholders::_2); auto key4 = myevent.Connect(std::move(f1)); std::function<void(int, int)> f2 = printLocal; auto key5 = myevent.Connect(std::move(f2)); int a = 1; int b = 2; myevent.Notify(a, b); // 触发 testA.printNoParam(); myevent.Disconnect(key1); //移除 } int main(int, char *[]) { test(); system("pause"); return 0; }
相关推荐
本文将深入探讨C++11中的函数委托、观察者模式以及Lambda表达式的应用,特别是它们如何在界面开发中发挥作用。 首先,C++11的函数委托是通过函数对象(functor)或者函数指针实现的。它提供了一种方式来保存一个...
在C#中,委托和事件是实现观察者模式的主要手段,而C++中虽然没有内置的委托和事件机制,但可以通过模板、函数指针、回调函数等方式来模拟类似的功能。MFC(Microsoft Foundation Classes)框架中,消息投递机制就是...
### 当析构函数遇到多线程——C++中线程安全的对象回调 #### 1. 多线程下的对象生命期管理 C++作为一种需要程序员手动管理对象生命周期的语言,在多线程环境中尤其需要谨慎处理对象的创建和销毁过程。由于多线程...
C++ 中的观察者模式通常通过定义一个主题类(Subject),它持有一个或多个观察者(Observer)的引用,当主题的状态发生改变时,会调用观察者的更新方法。 在给定的标题和描述中,我们看到观察者模式与委托机制...
回调函数在计算机编程中是一种非常重要的机制,尤其在C++和C这样的编程语言中,它允许我们传递一个函数作为参数给另一个函数,这样被调用的函数可以在适当的时候执行我们提供的函数。在Windows API中,回调函数常常...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...
7. **回调函数与设计模式**:回调函数是观察者模式、发布订阅模式等设计模式的一种实现方式,帮助实现松耦合的系统。 总的来说,回调函数是软件开发中不可或缺的一部分,它提供了处理异步操作和事件响应的有效手段...
- Function(观察者)库:提供了函数对象和回调机制的高级特性。 - Signals库:用于实现信号和槽机制,可以用于事件处理和观察者模式。 - Variants库:用于类型安全的联合体,可以持有多种类型的一种。 - Tuples...
1. **创建观察者**:首先,你需要创建一个观察者对象,该对象通常需要实现一个或多个特定的回调函数,这些函数会在接收到通知时被调用。 2. **注册观察者**:使用`CCNotificationCenter`的`addObserver`方法,传入...
C++中,观察者模式通常通过事件机制或回调函数实现。 8. 装饰模式:动态地给一个对象添加一些额外的职责。在C++中,装饰模式可以通过继承和组合来实现,保持原有类的接口不变。 9. 外观模式:提供一个统一的接口,...
1. **观察者模式的基本概念**:观察者模式是一种行为设计模式,它让多个对象(观察者)订阅一个主题(被观察者),当主题状态改变时,会通知所有订阅者。在C++中,观察者通常是一个类,它实现了特定的回调接口。 2....
6. **观察者模式**:观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。C++中可以使用`std::function`和`std::vector`来实现事件发布和订阅。 7....
**观察者模式**是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C++中,观察者模式通常通过定义主题(Subject)和观察者...
3. **观察者模式**(发布-订阅):定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。C++中可以使用STL的信号槽库如Boost.Signals2,C语言则可以通过回调函数和事件...
C++可以通过事件驱动和回调函数来实现这一模式。 责任链模式允许将请求沿着处理者链传递,直到某个处理者处理请求。每个处理者都可以选择处理请求或将其传递给链上的下一个处理者。C++中可以使用指针或引用链表来...
3. **观察者模式**:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C++中,通常通过事件驱动和回调函数来实现。 4. **装饰器模式**:动态地给一个对象...
C++中的命令模式通常涉及到函数指针或回调函数。 此外,课程还可能涉及其他如观察者模式、策略模式等,这些模式都是为了提高代码的复用性和可扩展性。 通过这个课程,开发者不仅可以掌握C++设计模式的基本概念,还...
C++中,命令模式涉及到了函数对象(functor)和回调机制。 14. **解释器模式**:给定一个语言,定义它的文法表示,并且提供一个解释器来处理这种语言中的句子。在C++中,可以利用递归和抽象语法树来实现。 15. **...
同时,C++11及后续标准引入的新特性,如智能指针(Smart Pointers)和Lambda表达式,进一步增强了设计模式的应用,比如在资源管理中使用弱引用实现更安全的单例,或者使用Lambda简化回调函数的处理。 学习这个框架...