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

我似乎可以上类的唯一方法是2-d的 child 类。但这是我要避免的,因为它将导致大量重复的代码。

例如:

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

关于c++ - 部分模板专门化以展开特定大小的循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50450225/

10-13 08:34