我有一个带状矩阵类,它继承自一个抽象矩阵类
template <typename T, std::size_t R, std::size_t B>
class BMatrix : public Matrix<T, R, R> {
...
};我想要一个三对角矩阵类,我是如何做到的,如下所示(使用继承)
template <typename T, std::size_t R>
class TriMatrix : public BMatrix<T, R, 3> {
...
}现在我不确定这是否是最好的做法(因为对于三对角矩阵有非常有效的方法,但没有那么多的一般带状矩阵)。虽然上面的工作,我想使用模板专门化。然而,我混合了模板类型和变量。
有没有办法不用继承就能做到这一点呢?
例如,像这样的
template <typename T, std::size_t R, >
class BMatrix<T, R, 3> {
...
} typedef TMatrix ??发布于 2019-09-13 16:28:47
如果我理解正确的话,您可能有自己的部分专业化认证:
template <typename T, std::size_t R>
class BMatrix<T, R, 3> {
// ...
};和一个using设施
template <typename T, std::size_t R>
using TriMatrix = BMatrix<T, R, 3>;发布于 2019-09-13 19:18:25
您断言有了特殊化,您将需要重新实现所有内容,这一点是正确的。有一些使用继承的变通方法(泛型BMatrix和专用BMatrix都可以从公共基础继承),但我想指出一些替代模式。
首先,如果你想坚持当前的类设计,在某些操作中使用成员函数,你可以简单地实现泛型类中的所有东西,并在B!=3时使用static_assert来阻止某人使用特定的方法。由于类模板成员函数在实际使用之前不会实例化,因此在不适用的一般情况下可以安全地使用这些函数。如果您想为一个算法提供更优的实现,您可以使用if constexpr (或者如果两个备选方案都可以编译,则只使用if ),其中已存在针对一般情况的不太理想的版本。
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>;其次,您可以选择不将所有操作都作为类成员实现,而是使用常规的非成员函数。这样,您就可以修复某些参数并使用重载:
// 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; }https://stackoverflow.com/questions/57919697
复制相似问题