我写了一个矩阵类,可以采用不同的大小。现在,我想展开特定大小的循环。我应该怎么做?
我似乎可以上类的唯一方法是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 = 2
和N = 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/