我正在尝试通过创建一个包含矩阵和对这些矩阵进行操作的库来提高我的模板技能(我所知甚少)。基本上,我希望矩阵是非常强类型的(在编译时已知数据类型和大小),而且我还希望能够自动推导转置矩阵的类型。
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(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字节边界上对齐行 vector )并进行其他类型的处理。我希望这样做能使自己脚下很多次,但是我要到达这里的主要目的是体验,并找出有效的方法和无效的方法(难做的事和无效的事) ')。

@Bo Perrson:我知道为什么第一个版本不能编译,但是我想知道第二个尝试是否有一个更简单的版本可以工作。主要问题是MyMatrix本身是一个类模板,我需要以某种方式将其模板参数传递给Transpose-struct。

@VJo:我认为那不行。如果T本身是MyMatrix ,则转置矩阵应将Transpose<T>作为数据类型,而不是T本身。对于所有基本类型(char,int,double ...),这当然是正确的,并且更简单。

最佳答案

是的,您很复杂。

如果您有这样的声明:

template< typename TDataType, size_t rows, size_t cols > class MyMatrix

那么转置函数应该是这样的:
template< typename T, size_t rows, size_t cols >
MyMatrix< T, cols, rows > Transpose( const MyMatrix< T, rows, cols > & m )
{
  MyMatrix< T, cols, rows > res;
  // implementation
  return res;
}

关于c++ - 使用模板类作为参数专门化模板结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6244583/

10-08 21:34