参数化typedef可能吗?

时间:2013-04-30 18:38:09

标签: c++ templates generics

我想知道是否可以使用某种参数化的typedef。

为了说明,在我的代码中我使用了这个typedef:

typedef std::queue<std::vector<unsigned char>, std::deque<std::vector<unsigned char> > > UnsignedCharQueue;

正如您所看到的,这是一个相当笨重的构造,因此typedef是有意义的。但是,如果我想拥有其他数据类型的队列,我需要事先进行彻底的定义。

所以我在想是否可以使用这样的结构:

typedef std::queue<std::vector<T>, std::deque<std::vector<T> > > Queue<T>;

private:
    Queue<unsigned char> mMyQueue;

类似于Java中的泛型。

2 个答案:

答案 0 :(得分:9)

在C ++ 11中,您可以使用模板别名,例如:

template<typename T>
using my_alias = some_class_template<T>;

// ...
my_alias<T> obj; // Same as "some_class_template<T> obj;"

所以在你的情况下,它将是:

template<typename T>
using Queue = std::queue<std::vector<T>, std::deque<std::vector<T> > >;

另请注意,在C ++ 11中,您不需要在闭合的尖括号之间留出空格,因此可以按如下方式重写上述内容:

template<typename T>
using Queue = std::queue<std::vector<T>, std::deque<std::vector<T>>>;
//                                                               ^^^

在C ++ 03中,您可以通过以下方式定义Queue元函数:

template<typename T>
struct Queue
{
    typedef std::queue<std::vector<T>, std::deque<std::vector<T> > > type;
};

然后你会用这种方式:

Queue<int>::type obj;

如果您在带参数T的模板中使用它(如下所示),请不要忘记typename消歧器:

template<typename T>
struct X
{
    typename Queue<T>::type obj;
//  ^^^^^^^^
}

答案 1 :(得分:2)

是的,它的工作原理如下:

template <typename T> using Queue = std::queue<std::vector<T>, std::deque<std::vector<T> > >;