c++ - 您可以实例化模板的非专用版本并在专用版本中继承它吗?

标签 c++ templates matrix specialization

我正在尝试将 Vector 定义为行/列 MatrixVector 需要一些 Matrix 没有的方法,所以我特化了 Matrix:

template<typename T, unsigned N, unsigned M>
struct Matrix {
    T data[N][M];
};

template <typename T, unsigned N>
struct Matrix<T, N, 1> : public Matrix<T, N, 1> {
    T at(unsigned index) {
        return data[index][0];
    }
};

template <typename T, unsigned N>
using Vector = Matrix<T, N, 1>;

此代码无法编译,因为特化是递归类型。我在这里想要继承的原因是,我可以将 Matrix 的所有内容包含到特化中,而无需复制和粘贴。

有没有办法实例化原始 Matrix 并从中继承?如果有,我的类型会变成非递归的吗?

想到的解决此问题的另一种方法是简单地 #include 将常规 Matrix 的内容放入初始定义和所有特化中。但这远非惯用语。

最佳答案

这是一种方法:

template<typename T, unsigned N, unsigned M>
struct Matrix {
    T data[N][M];
};

template<typename T, unsigned N>
struct MatrixTN : Matrix <T, N, 1> {
    T at(unsigned index) {
        return this->data[index][0];
    }
};

template<typename T, unsigned N>
using Vector = MatrixTN <T, N>;

请注意,需要 this->data 才能将 data 的评估延迟到模板查找的第二阶段。

Live demo

关于c++ - 您可以实例化模板的非专用版本并在专用版本中继承它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61992243/

相关文章:

c++ - 如何使用vector <vector <int >>找到严格位于矩阵次对角线上的元素之和?

c++ - 可变参数模板和 std::array 意外行为

c++ - 如何阻止 ostringstream (oss) 添加/覆盖预定义变量?

c# - 在 Visual Studio 中创建 .NET Core 模板

java - 自由标记模板 : "Sort_by" one or other

c++ - 使用聚合初始化器初始化类的模板(聚合类型)成员但没有额外的括号

python - 使 numpy 矩阵更稀疏

c++ - 类模板的成员模板的成员模板的显式模板函数特化是否有效?

c++ - 窗口最大化/最小化/恢复的 WM Windows 消息是什么?

python - 在 numpy 中获取 block 矩阵的均值/和的最佳方法?