Say I have a class event_basedefined like this
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;
};
and some empty tag structures defined this way
struct mutable_tag{};
struct callable_tag{};
Then I want to get this base class based on (or both) tags specified in the template package
For one 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...>{};
Then for a few tags:
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...>{};
Now I want to be able to specialize the class for cases where no tags are specified
eg:
template<typename ... Args>
class event<Args...>: event<callable_tag, mutable_tag, Args...>{};
Now this clearly won't work, because he really doesn't specialize in class; but I don’t know what to write instead. I want to be able to deduce from already defined classes with tags, so that I do not need to over-define operators and methods.
How can this be achieved?