#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;
}


갑자기 생각나서 구현해봄