我试图通过创建一个包含矩阵和对这些矩阵的操作的库来塑造我的模板技能(我知道的很少)。基本上,我希望我的矩阵是非常强类型的(数据类型和大小在编译时已知),并且我还希望能够自动扣除转置矩阵的类型。
template< typename TDataType, size_t rows, size_t cols > class MyMatrix
矩阵可以嵌套,因此TDataType
可以是整数类型,也可以是单独的MyMatrix<...>
,导致转置矩阵的数据类型不一定与原始矩阵的数据类型相同,例如:(
Transpose( MyMatrix< MyMatrix< char, 2, 3 >, 4, 6 > ) ==> MyMatrix< MyMatrix< char, 3, 2 >, 6, 4 >
外层矩阵的数据类型已更改)
我第一次尝试转置类型演绎是:
template< typename TDataType >
struct Transpose
{
typedef TDataType type;
};
template<>
struct Transpose< MyMatrix<TDataType, rows, cols> >
{
typedef MyMatrix<typename Transpose<TDataType>::type, cols, rows> type;
};
我没有找到这样做的方法,因为我似乎无法使用 MyMatrix 专门化 Transpose 模板(TDataType 未知和类似错误)。
我想出的唯一可编译的解决方案(我什至不知道它是否有效)是这样的:
template< typename TMatrixType, typename TDataType, size_t rows, size_t cols >
struct Transpose
{
typedef TMatrixType type;
};
template< typename TDataType, size_t rows, size_t cols >
struct Transpose< MyMatrix<TDataType, rows, cols>, TDataType, rows, cols >
{
typedef MyMatrix< typename Transpose<TDataType,TDataType,rows,cols>::type, cols, rows > type;
};
我相信我把事情弄得太复杂了;有没有更简单的解决方案来实现我想要的?
我的问题的答案的答案(我发布了没有帐户的问题,所以我没有足够的代表以正常方式做事)。已经非常感谢了!
@Bo Persson @Will A:我不打算将其用作通用矩阵库,我想对特定(事先已知)大小的矩阵执行操作,并想看看我可以通过使用这种方法获得什么。它可能允许我优化矩阵的内存布局(例如在 32 字节边界上对齐行向量)并做其他类型的时髦的东西。我希望通过这样做很多次,但我想要达到的主要目的是体验并找出哪些有效,哪些无效(以及什么是难做的,什么是难做的) 't)。
@Bo Perrson:我知道为什么第一个版本无法编译,但我想知道我的第二次尝试是否有一个更简单的版本可以工作。主要问题是 MyMatrix 本身就是一个类模板,我需要以某种方式将它的模板参数获取到转置结构。
@VJo:我认为这行不通。如果 T 是 MyMatrix<..> 本身,则转置矩阵应该具有Transpose<T>
数据类型,而不是 T 本身。对于所有基本类型(char、int、double ...),这当然是正确的并且更简单。