C++ 部分模板专门化以展开特定大小的循环

C++ 部分模板专门化以展开特定大小的循环,c++,C++,我已经写了一个矩阵类,可以采取不同的大小。现在我要展开特定大小的循环。我该怎么做 看来我唯一能开始工作的方法就是上一堂二维儿童课。但我希望避免这种情况,因为这将导致大量重复代码 例如: #include <iostream> template<class T, size_t M, size_t N> class matrix { matrix<T,M,N>& operator*= (const matrix<T,M,N> &B

我已经写了一个矩阵类,可以采取不同的大小。现在我要展开特定大小的循环。我该怎么做

看来我唯一能开始工作的方法就是上一堂二维儿童课。但我希望避免这种情况,因为这将导致大量重复代码

例如:

#include <iostream>

template<class T, size_t M, size_t N>
class matrix
{
  matrix<T,M,N>& operator*= (const matrix<T,M,N> &B);
};

template<class T, size_t M, size_t N>
matrix<T,M,N>& matrix<T,M,N>::operator*= (const matrix<T,M,N> &B)
{
  // ...
  return *this;
}

int main()
{
  return 0;
}
#包括
样板
类矩阵
{
矩阵和运算符*=(常数矩阵和B);
};
样板
矩阵和矩阵::运算符*=(常数矩阵和B)
{
// ...
归还*这个;
}
int main()
{
返回0;
}
现在,我想为
M=2
N=2
的情况添加一个实现,其中我展开所有循环以提高效率


(我在以前的实现中对展开进行了计时,这似乎确实有意义,特别是对于本示例中介绍的更复杂的操作。)

您可以将
操作符*=
委托给重载函数模板。例如:

template<class T, size_t M, size_t N>
class matrix
{
public:
    matrix<T,M,N>& operator*=(const matrix<T,M,N>&);
};

// Generic version.
template<class T, size_t M, size_t N>
void inplace_dot(matrix<T,M,N>& a, matrix<T,M,N> const& b); 

// Overload for 2x2 matrix.
template<class T>
void inplace_dot(matrix<T,2,2>& a, matrix<T,2,2> const& b);

template<class T, size_t M, size_t N>
matrix<T,M,N>& matrix<T,M,N>::operator*=(const matrix<T,M,N>& b)
{
    inplace_dot(*this, b);
    return *this;
}
模板
类矩阵
{
公众:
矩阵和运算符*=(常数矩阵和);
};
//通用版本。
样板
点内空隙(矩阵a、矩阵常数b);
//2x2矩阵的过载。
样板
点内空隙(矩阵a、矩阵常数b);
样板
矩阵和矩阵::运算符*=(常数矩阵和b)
{
原地点(*此,b);
归还*这个;
}

为什么不让编译器决定何时展开,何时不展开?@MivVG我有一些更复杂的操作,当显式编写时,二维的计算效率会更高,因为我可以使用编译器没有的知识。从这个角度来看,我的问题可能有点过于简单。尽管眼前的问题依然存在。