2013-04-30 79 views
2

我想知道是否有可能有某种参数化的typedef。参数化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泛型。

+1

[C++ template typedef]的可能重复(http://stackoverflow.com/questions/2795023/c-template-typedef) – 2013-04-30 18:40:26

回答

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++中

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

在C++ 03你可以定义:11,如下所示你不需要离开封闭尖括号之间的空间,所以上述可改写一个Queue元函数是这样的:

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

,你会再使用这种方式:如果你正在使用它的模板与参数T(如下所示),不要忘了

Queue<int>::type obj; 

typename消歧:

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

该死,你闪电般快。我打算发布这个。 – 2013-04-30 18:40:13

+0

@ H2CO3:我很幸运能够尽早得到新的问题通知;) – 2013-04-30 18:40:44

+0

@AndyProwl:通知? – 2013-04-30 18:41:18

2

是的,它的工作原理是这样的:

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

g ++ c Devolus 2013-04-30 21:14:24

+0

@Devolus:使用g ++时,请确保将-std = C++ 11指定为命令行参数之一。 – 2013-04-30 22:18:26

+0

我试过这个开关,但它不能识别它。 – Devolus 2013-05-01 06:26:20