Template specialization for multiple tags in any order

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?

+4
1

,

, , , :

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

+1

All Articles