带有模板参数的部分specialize模板
partial specialize template with template argument
我有这个模板
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_queue
和std::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;
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 带有模板参数的部分specialize模板