class NoCopy
{
protected:
NoCopy() = default;
NoCopy(const NoCopy& n) = delete;
NoCopy&operator=(const NoCopy&) = delete;
~NoCopy() = default;
};
template<typename Fun>
class Event : public NoCopy
{
public:
Event(){}
~Event(){}
int connect(const Fun&&f)
{
return Assgin(f);
}
int connect(const Fun&f)
{
return Assgin(f);
}
void disconnect(int key)
{
conn.erase(key);
}
template<typename...Args>
void Notify(Args&&...args)
{
for (auto& f : conn)
f.second(std::forward<Args>(args)...);
}
private:
template<typename F>
int Assgin(F&&f)
{
int k = ++mobserverID;
conn.emplace(k, std::forward<F>(f));
return k;
}
private:
int mobserverID;
std::map<int, std::function<Fun> > conn;
};
void Print(int a,int b)
{
std::cout << a << b << endl;
}
int main()
{
Event<void(int, int)> e;
int key = e.connect(Print);
e.Notify(1, 2);
e.disconnect(key);
e.Notify(1, 2);
{
protected:
NoCopy() = default;
NoCopy(const NoCopy& n) = delete;
NoCopy&operator=(const NoCopy&) = delete;
~NoCopy() = default;
};
template<typename Fun>
class Event : public NoCopy
{
public:
Event(){}
~Event(){}
int connect(const Fun&&f)
{
return Assgin(f);
}
int connect(const Fun&f)
{
return Assgin(f);
}
void disconnect(int key)
{
conn.erase(key);
}
template<typename...Args>
void Notify(Args&&...args)
{
for (auto& f : conn)
f.second(std::forward<Args>(args)...);
}
private:
template<typename F>
int Assgin(F&&f)
{
int k = ++mobserverID;
conn.emplace(k, std::forward<F>(f));
return k;
}
private:
int mobserverID;
std::map<int, std::function<Fun> > conn;
};
void Print(int a,int b)
{
std::cout << a << b << endl;
}
int main()
{
Event<void(int, int)> e;
int key = e.connect(Print);
e.Notify(1, 2);
e.disconnect(key);
e.Notify(1, 2);
getchar();
}