代码之家  ›  专栏  ›  技术社区  ›  Tom de Geus

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

c++
  •  2
  • Tom de Geus  · 技术社区  · 7 年前

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

    唯一能让我工作的方法是一个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 = 2 N = 2 我展开所有循环以获得效率。

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Maxim Egorushkin    7 年前

    你可以委派 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;
    }