C++ 矩阵类的体系结构:继承还是专用化?

Architecture of C++ matrix classes: inheritance or specialisation?

提问人:Julienchz 提问时间:10/30/2023 更新时间:10/30/2023 访问量:79

问:

我想定义一个类:将简单和经典的方法应用于任何矩阵()。template <class T, std::size_t M, std::size_t N> class Matrixstd::array<std::array<T, N>, M> m_data;

然后我想参加专门的课程,例如:.理想情况下,我希望能够在特定类中使用第一个类的泛型方法。为此,我正在考虑创建一个具有遗产的模板。问题是,例如,要使用 I 必须转换 中返回的值,这是我宁愿避免的。 在实践中是完全等价的,所以使用类专用化似乎是合适的,但是你必须重写所有方法,要么复制一些代码,要么创建一个非专用类的实例,我想要一些特定维度的特定方法(例如旋转)在每个相应的方法中。template <class T> class Matrix<T, 2, 2>class <class T> class Matrix2x2 : public Matrix<T, 2, 2>class Matrix<T, M, N>::transpose()Matrix2x2Matrix2x2Matrix2x2<T> and Matrix<T, 2, 2>

我尝试过使用继承,它有效,但我有很多代码重复,我想重构所有代码。 什么是最好的设计?有没有更好的解决方案?

谢谢你的帮助。

C++ 继承 设计模式 体系结构 模板专业化

评论

2赞 user12002570 10/30/2023
向我们展示代码。还 codereview.stackexchange.com
2赞 HolyBlackCat 10/30/2023
为什么 2x2 无论如何都是一个特例?我理解人们何时专门使用 ,作为成员名称,但为什么要使用矩阵?如果您只想要一些自定义函数,请不要专门化任何内容,而是用于有条件地启用这些函数。vec<2>xyrequires
1赞 HolyBlackCat 10/30/2023
忽略这一点,有一个单独的听起来像是一个坏主意,因为有些人/代码会使用它,有些人会使用 ,导致不一致。相反,从 CRTP 基类继承及其所有专用化,并将所有内容移动到那里。(当编译器实现 C++23 显式参数时,您将能够在基类中使用它而不是 CRTP。例如,CRTP 解决了返回类型为 的问题。class Matrix2x2Matrix<T,2,2>Matrixthistranspose()
1赞 Pepijn Kramer 10/30/2023
除了转置(和在内存中移动数据)之外,您还可以在矩阵上创建一个视图(迭代器),该视图(迭代器)访问您的所有内存位置(只要模式是可预测的,缓存仍然有效)。请看 [std::mdspan]。我当然不会根据矩阵大小创建专门的版本(除非你有证明的性能问题),而代码重用是查看继承的最糟糕原因。虽然有 CRTP/mixin 方法,您可以在其中使用实现引入模板化专业化类(可能也值得研究)
0赞 Homer512 10/30/2023
Eigen 通过奇怪的重复模板模式解决了这个问题

答: 暂无答案