首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量模板专门化

变量模板专门化
EN

Stack Overflow用户
提问于 2019-09-13 16:11:10
回答 2查看 81关注 0票数 0

我有一个带状矩阵类,它继承自一个抽象矩阵类

代码语言:javascript
复制
template <typename T, std::size_t R, std::size_t B>
class BMatrix : public Matrix<T, R, R> {
    ...
};

我想要一个三对角矩阵类,我是如何做到的,如下所示(使用继承)

代码语言:javascript
复制
template <typename T, std::size_t R>
class TriMatrix : public BMatrix<T, R, 3> {
 ...
}

现在我不确定这是否是最好的做法(因为对于三对角矩阵有非常有效的方法,但没有那么多的一般带状矩阵)。虽然上面的工作,我想使用模板专门化。然而,我混合了模板类型和变量。

有没有办法不用继承就能做到这一点呢?

例如,像这样的

代码语言:javascript
复制
template <typename T, std::size_t R, >
class BMatrix<T, R, 3> {
 ...
} typedef TMatrix ??
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-13 16:28:47

如果我理解正确的话,您可能有自己的部分专业化认证:

代码语言:javascript
复制
template <typename T, std::size_t R>
class BMatrix<T, R, 3> {
 // ...
};

和一个using设施

代码语言:javascript
复制
template <typename T, std::size_t R>
using TriMatrix = BMatrix<T, R, 3>;
票数 4
EN

Stack Overflow用户

发布于 2019-09-13 19:18:25

您断言有了特殊化,您将需要重新实现所有内容,这一点是正确的。有一些使用继承的变通方法(泛型BMatrix和专用BMatrix都可以从公共基础继承),但我想指出一些替代模式。

首先,如果你想坚持当前的类设计,在某些操作中使用成员函数,你可以简单地实现泛型类中的所有东西,并在B!=3时使用static_assert来阻止某人使用特定的方法。由于类模板成员函数在实际使用之前不会实例化,因此在不适用的一般情况下可以安全地使用这些函数。如果您想为一个算法提供更优的实现,您可以使用if constexpr (或者如果两个备选方案都可以编译,则只使用if ),其中已存在针对一般情况的不太理想的版本。

代码语言:javascript
复制
template<int W, int H>
class Ellipse
{
    int Radius() const
    {
        static_assert(W==H); // only applies to circles
        return W;
    }

    float Circumference() const
    {
        if (W == H)
            return 2*PI*W;
        else
            return ... // ellipse circumference is not trivial
    }
};

// Handy type alias
template<int R> using Circle = Ellipse<R,R>;

其次,您可以选择不将所有操作都作为类成员实现,而是使用常规的非成员函数。这样,您就可以修复某些参数并使用重载:

代码语言:javascript
复制
// Radius, only for circles
template<int R>
int Radius(Ellipse<R,R> e) { return R; }

// Circumference, generic case
template<int W, int H>
int Circumference(Ellipse<W,H> e) { return /* ... */; }

// Circumference, specific case for circles
template<int R>
int Circumference(Ellipse<R,R> e) { return 2*PI*R; }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57919697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档