我想知道是否可以使用某种参数化的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中的泛型。
答案 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> > >;