我有这个模板
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;
或任何功能相同的(编译数组大小的编译时间常量)。如何实现这一目标?
更新
所以我已经做了一些挖掘,显然你不能部分地专门化一个成员函数而没有相应的整个类的部分特化。这就解释了为什么我的尝试不起作用。
答案 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_queue
和std::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;