C++模板和别名

Joh*_*han 3 c++ alias templates c++11 c++14

这将在库中使用,而不是像示例一样,下面的示例使得它只是解释了问题.

我有一个BaseType模板专门化的模板类.

template<class...> 
class BaseType; //Forward declare

template<typename T>  
BaseType<T> { /* ...implementation 1... */ };

template<typename T, typename R>  
BaseType<T,R> { /* ...implementation 2... */ };
Run Code Online (Sandbox Code Playgroud)

我现在将为shared_ptr<BaseType>模板创建一个别名.为其中一个模板版本执行此操作很好.

template<typename T>
using SlotType = std::shared_ptr<BaseType<T> >;

using EventArgSlot = SlotType<EventArgs>;

EventArgSlot slot1;
Run Code Online (Sandbox Code Playgroud)

但是我应该如何定义别名,以便它也支持这个:

using MessageIntegerSlot = SlotType<MessageArgs, int>;
MessageIntegerSlot slot2;
Run Code Online (Sandbox Code Playgroud)

只使用相同的附加模板参数添加其他别名不起作用:

template<typename T, typename R>
using SlotType = std::shared_ptr<BaseType<T,R> >;
Run Code Online (Sandbox Code Playgroud)

这可以在C++ 11/14中解决吗?

son*_*yao 6

您可以利用参数包并将SlotTypeto 的定义更改为

template<typename... T>
using SlotType = std::shared_ptr<BaseType<T...> >;
Run Code Online (Sandbox Code Playgroud)

然后

using EventArgSlot = SlotType<EventArgs>;              // use the 1st specialization of BaseType
using MessageIntegerSlot = SlotType<MessageArgs, int>; // use the 2nd specialization of BaseType
Run Code Online (Sandbox Code Playgroud)