部分模板专用化,用于展开特定大小的循环

Partial template specialization to unroll loops for specific sizes

本文关键字:循环 用于 专用      更新时间:2023-10-16

我写了一个矩阵类,它可以采用不同的大小。现在我想展开特定尺寸的循环。我应该怎么做?

我似乎可以工作的唯一方法是2-D的儿童班。但我想避免这种情况,因为它会导致很多重复的代码。

例如:

#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;
}

现在,我想为M = 2N = 2的情况添加一个实现,我展开所有循环以提高效率。

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

您可以将operator*=委托给重载的函数模板。 例如:

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;
}