带有模板参数的部分specialize模板

partial specialize template with template argument

本文关键字:specialize 模板 参数      更新时间:2023-10-16

我有这个模板

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

我有这个适配器模板

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

我想做的是像一样使用带有Stack的Array

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;

或任何功能等效的东西(数组大小的编译时间常数)。如何做到这一点?

更新

所以我做了更多的挖掘,很明显,如果没有整个类的相应部分专门化,就不能部分专门化成员函数。这就解释了为什么我的尝试不会奏效。

与其将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_queuestd::stack就是这样设计的。

只需要一个显式的数组大小,并使用以下内容:

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;