部分特殊化模板与模板参数

时间:2015-04-28 01:38:20

标签: c++ templates

我有这个模板

template <typename T, size_t maxsiz = 6>
class Array;

我有这个适配器模板

template <typename T, template <typename> class Container = std::vector>
class Stack;

我想要做的是像这样使用Array with Stack

Stack<int, Array> s;

但是,Array的默认构造函数不符合Stack的要求,因此我需要专门使用Stack for Array。 理想情况下,我只想专门化Stack<T, Array>的ctor,所以我可以在初始化时为内部Array成员提供正确的参数。

我试过这个

template <typename T>
class Stack<T, Array>::Stack() : container(0) {  }  // container is the name of the wrapped Container
然而,它有问题。首先,它不会编译(是啊...),其次,我希望能够给阵列一个不同的大小,像这样

Stack<int, Array<int, 13>> stack;

或任何功能相同的(编译数组大小的编译时间常量)。如何实现这一目标?

更新

所以我已经做了一些挖掘,显然你不能部分地专门化一个成员函数而没有相应的整个类的部分特化。这就解释了为什么我的尝试不起作用。

2 个答案:

答案 0 :(得分:1)

您应该提供适用于Stack的{​​{1}}适配器,而不是将Array更改为Array

Stack

那会让你这样做:

template <typename T>
struct StackArray : Array<T> {
    StackArray()
        : Array<T>(0)
    { }

    // anything else that needs to change here
};

此外,您的Stack<int, StackArray> s; 模板不正确。您无法使用Stack作为std::vector的默认模板,因为template <typename> class Container需要两个模板参数。如果你做到了它可能会更有用:

std::vector

那时我们可以将template <typename T, typename Container = std::vector<T>> struct Stack { .. }; 参数添加到maxsiz并执行以下操作:

StackArray

这就是std::priority_queuestd::stack的设计方式。

答案 1 :(得分:0)

总是需要一个明确的数组大小并使用类似的东西:

template <typename T, int N>
class Stack<T, Array<T, N>>::Stack() : Array<T, N> {  }

用法:

Stack<int, Array<int>> x;
Stack<int, Array<int, 2>> y;