#include <functional>
#include <vector>

template<typename ... Args>
class event_base{
    public:
        using delegate_type = std::function<void(Args...)>;
        using id_type = size_t;

    protected:
        std::vector<std::tuple<delegate_type, id_type>> m_funcs;
};

struct mutable_tag{};
struct callable_tag{};

template<class ...>
class event;

template<typename ... Args>
class event<mutable_tag, Args...>: public event_base<Args...>{};

template<typename ... Args>
class event<callable_tag, Args...>: public event_base<Args...>{};

template<typename ... Args>
class event<mutable_tag, callable_tag, Args...>: public event<mutable_tag, Args...>, public event<callable_tag, Args...>{};

template<typename ... Args>
class event<callable_tag, mutable_tag, Args...>: public event<mutable_tag, callable_tag, Args...>{};

template<typename ... Args>
class event : event<callable_tag, mutable_tag, Args...>{};

int main()
{
    event<int> e;
    return 0;
}
