任何顺序的多个标签的模板专业化

时间:2014-09-24 12:15:46

标签: c++ templates c++14

说我有一个类event_base定义如此

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...>{};

现在我希望能够在没有指定标签的情况下专门化该类

E.g:

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

现在显然不会起作用,因为它实际上并不专门化这个类;但我不知道该怎么写而不是这个。我希望能够从已经定义的带有标签的类派生,这样我就不必冗余地定义运算符和方法。

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

  

现在我希望能够在没有指定标签的情况下专门化该类

事实上,不,它不是专业化而是正常情况,所以使用:

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

Live example