专门做ppt的网站叫什么今日小说搜索风云榜
该示例代码采用C11标准,解决以下问题:
- 消除了类继承的强耦合方式;
- 通知接口使用可变参数模板,支持任意参数;
示例代码
.h文件如下:
#include <functional>
#include <string>
#include <map>class NonCopyable
{
protected:NonCopyable() = default;~NonCopyable() = default;NonCopyable(const NonCopyable&) = delete;NonCopyable& operator=(const NonCopyable&) = delete;
};template<typename Func>
class Events : NonCopyable
{
public:Events(){}~Events(){}int Connect(Func&& f){return Assgin(f);}int Connect(const Func& f){return Assgin(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)...);}}private:template<typename F>int Assgin(F&& f){int k = m_observerId++;m_connections.emplace(k,std::forward<F>(f));return k;}int m_observerId = 0;std::map<int, Func> m_connections;
};
.cpp文件如下:
#include <iostream>
#include "C++11_Observer.h"using namespace std;
struct stA
{int a, b;void print(int a, int b){cout << a << " , " << b << endl;}
};void print(int a, int b)
{cout << a << " , , " << b << endl;
}int main()
{Events<std::function<void(int, int)>> myevent;auto key = myevent.Connect(print);stA t;auto lamadakey = myevent.Connect([&t](int a, int b) {t.a = a; t.b = b; });std::function<void(int, int)> f = std::bind(&stA::print,&t,std::placeholders::_1,std::placeholders::_2);myevent.Connect(f);int a = 1, b = 2;myevent.Notify(a,b);myevent.DisConnect(key);system("pause");return 0;
}
输出结果如下: