#include<vector>
#include<functional>
template<typename ..._ArgT> class Event
{
public:
Event() = default;
Event(Event && ref) = delete;
Event(const Event & ref) = delete;
using Fn = std::function<void(_ArgT...)>;
Event<_ArgT...>& operator += (const Fn & e)
{
m_handlers.push_back(e);
return *this;
}
bool operator == (const Event * e)
{
if (e == nullptr)
{
return m_handlers.size() == 0;
}
return this == e;
}
bool operator != (const Event * e)
{
if (e != nullptr)
{
return m_handlers.size() != 0;
}
return this != e;
}
void operator () (_ArgT... args)
{
for (const Fn & it : m_handlers)
{
it(args...);
}
}
private:
std::vector<Fn> m_handlers;
};
template<> class Event<void>
{
public:
Event() = default;
Event(Event && ref) = delete;
Event(const Event & ref) = delete;
using Fn = std::function<void(void)>;
Event<void>& operator += (const Fn & e)
{
m_handlers.push_back(e);
return *this;
}
bool operator == (const Event<void> * e) const
{
if (e == nullptr)
{
return m_handlers.size() == 0;
}
return this == e;
}
bool operator != (const Event<void> * e) const
{
if (e != nullptr)
{
return m_handlers.size() != 0;
}
return this != e;
}
void operator () (void) const
{
for (const Fn & it : m_handlers)
{
it();
}
}
size_t size() const
{
return m_handlers.size();
}
private:
std::vector<Fn> m_handlers;
};
#include<Windows.h>
int wmain(int argc, wchar_t *argv[])
{
Event<int> event;
if (event == nullptr)
{
std::cout << "Has no Handler" << std::endl;
}
event += [](int a) {
std::cout << a << std::endl;
};
if (event != nullptr)
{
std::cout << "Has Handler" << std::endl;
}
else
{
}
event(51);
Event<void> event2;
event2 += []() {
std::cout << "Handler is called!" << std::endl;
};
event2();
return 0;
}
갑자기 생각나서 구현해봄
그냥 c#을 쓰시죠?