2

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

4

2 回答 2

10

在 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;
//  ^^^^^^^^
}
于 2013-04-30T18:39:29.833 回答
2

是的,它是这样工作的:

template <typename T> using Queue = std::queue<std::vector<T>, std::deque<std::vector<T> > >;
于 2013-04-30T18:39:51.177 回答