#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;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gQXJncz4KY2xhc3MgZXZlbnRfYmFzZXsKICAgIHB1YmxpYzoKICAgICAgICB1c2luZyBkZWxlZ2F0ZV90eXBlID0gc3RkOjpmdW5jdGlvbjx2b2lkKEFyZ3MuLi4pPjsKICAgICAgICB1c2luZyBpZF90eXBlID0gc2l6ZV90OwoKICAgIHByb3RlY3RlZDoKICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPGRlbGVnYXRlX3R5cGUsIGlkX3R5cGU+PiBtX2Z1bmNzOwp9OwoKc3RydWN0IG11dGFibGVfdGFne307CnN0cnVjdCBjYWxsYWJsZV90YWd7fTsKCnRlbXBsYXRlPGNsYXNzIC4uLj4KY2xhc3MgZXZlbnQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gQXJncz4KY2xhc3MgZXZlbnQ8bXV0YWJsZV90YWcsIEFyZ3MuLi4+OiBwdWJsaWMgZXZlbnRfYmFzZTxBcmdzLi4uPnt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgLi4uIEFyZ3M+CmNsYXNzIGV2ZW50PGNhbGxhYmxlX3RhZywgQXJncy4uLj46IHB1YmxpYyBldmVudF9iYXNlPEFyZ3MuLi4+e307Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gQXJncz4KY2xhc3MgZXZlbnQ8bXV0YWJsZV90YWcsIGNhbGxhYmxlX3RhZywgQXJncy4uLj46IHB1YmxpYyBldmVudDxtdXRhYmxlX3RhZywgQXJncy4uLj4sIHB1YmxpYyBldmVudDxjYWxsYWJsZV90YWcsIEFyZ3MuLi4+e307Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gQXJncz4KY2xhc3MgZXZlbnQ8Y2FsbGFibGVfdGFnLCBtdXRhYmxlX3RhZywgQXJncy4uLj46IHB1YmxpYyBldmVudDxtdXRhYmxlX3RhZywgY2FsbGFibGVfdGFnLCBBcmdzLi4uPnt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgLi4uIEFyZ3M+CmNsYXNzIGV2ZW50IDogZXZlbnQ8Y2FsbGFibGVfdGFnLCBtdXRhYmxlX3RhZywgQXJncy4uLj57fTsKCmludCBtYWluKCkKewogICAgZXZlbnQ8aW50PiBlOwogICAgcmV0dXJuIDA7Cn0K