首页 > 解决方案 > 部分模板专业化以展开特定大小的循环

问题描述

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

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

例如:

#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 = 2的情况添加一个实现。N = 2

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

标签: c++

解决方案


您可以委托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;
}

推荐阅读