我有这个模板
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 的要求,所以我需要为 Array 专门化 Stack。
理想情况下,我只想专门研究 Stack<T, Array>
的 ctor ,所以我可以在初始化时为内部数组成员提供正确的参数。
我试过了
template <typename T>
class Stack<T, Array>::Stack() : container(0) { } // container is the name of the wrapped Container
然而,它有问题。首先,它不会编译(是的......),其次,我希望能够给数组一个不同的大小,像这样
Stack<int, Array<int, 13>> stack;
或任何功能等效的东西(数组大小的编译时间常数)。如何做到这一点?
更新
所以我做了更多的挖掘,显然如果没有整个类的相应部分特化,你就不能部分特化一个成员函数。这解释了为什么我的尝试行不通。
最佳答案
而不是改变Stack
与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
的参数以及做类似的事情:
Stack<int, StackArray<int, 13>> s;
这就是 std::priority_queue
和 std::stack
被设计。
关于c++ - 带有模板参数的部分专用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908818/