c++ - 带有模板参数的部分专用模板

标签 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 的要求,所以我需要为 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;

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

更新

所以我做了更多的挖掘,显然如果没有整个类的相应部分特化,你就不能部分特化一个成员函数。这解释了为什么我的尝试行不通。

最佳答案

而不是改变StackArray一起工作, 你应该为 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/

相关文章:

c++ - 在模板库中输入范围

c++ - 内部类和外部成员的访问

javascript - 如何在 underscore.js 模板中使用 if 语句?

c++ - std::pair<> 的模板成员必须具有 const 复制构造函数。如何实现该约束

android - 使用 CMake 为 Android 配置 Qt5 5.7 应用程序

c++ - 为什么编译器在编译两个相似的类时输出不同?

c++ - 有没有更好的方法来选择正确的方法重载?

基于 C++ 模板参数的编译

c++ - 获取进程标识符总是返回 0

c++ - 如何使 std::make_pair 可与 std::bind* 一起使用?