该示例代码采用C11标准,解决以下问题:
- 消除了类继承的强耦合方式;
- 通知接口使用可变参数模板,支持任意参数;
示例代码
.h文件如下:
cpp
#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文件如下:
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;
}
输出结果如下: