在模板化类和函数的上下文中使用default-value作为参数的函数:-)

时间:2013-03-20 12:11:00

标签: c++ templates functor

成分:

  1. 在矩阵元素类型上模板化的矩阵类,用于处理子矩阵以及双/浮点等。

  2. 返回“真”对角线的矩阵成员方法,即在NxN子矩阵的情况下,对角线的那些,即大小为N的向量的矢量。

  3. 关于子矩阵的实现尽可能少的限制,并且在不使用子矩阵时没有不必要的“副作用”/要求,但是,比方说,只是加倍。

  4. 在某些算法中无缝使用矩阵类,例如:共轭梯度,理想情况下应该在某些通用矩阵和矢量类型上进行模板化。

  5. 这个想法是为GetDiagonalElements() - 矩阵方法提供一个函子,它有一个默认值,只复制diagional-element。忽略矩阵的实际大小(仅1x1),以下是我尝试提供该功能:

    #include <vector>
    
    template< typename T >
    struct Matrix
    {
      std::vector<T> data;
      Matrix() : data(1) {}
    
      // Default-functor for T2=T or convertible.
      template< typename T2 >
      struct GetDiagonalElementsFunc
      {
        void operator()( const T &t1, T2 &t2 ) { t2 = (T2)t1; }
      };
    
      template< typename T2, typename GetDiagonalElementsFunctor >
      void GetDiagonalElements( std::vector<T2> &diag,
        GetDiagonalElementsFunctor gdeFunctor=GetDiagonalElementsFunc<T2> 
      {
          diag.resize(1)
          gdeFunctor( data[0], diag[0] );
      }
    };
    
    void foo()
    {
      Matrix<double> mat;
      std::vector<double> diag;
      mat.GetDiagonalElements(diag);
    

    }

    编译器“说”: 无法推断'GetDiagonalElementsFunctor'

    的模板参数

    猜测仿函数作为模板参数是不需要的 - 我试过但是没有让它工作,可能很简单(?),虽然任何帮助赞赏,亲切的问候,Derik。

    PS:理想情况下,如果可能,没有额外/中间辅助类型。没有提升,没有C ++ 11。

    附加问题:如果我想要做同样的事情但是指定对角线访问仿函数作为矩阵模板声明(?)的一部分怎么办?

1 个答案:

答案 0 :(得分:3)

您不能在C ++ 98中的函数中使用默认模板参数...因此,您应该使用struct或两种函数来处理这种情况...具有两个函数的示例

  template< typename T2, typename Functor>
  void GetDiagonalElements( std::vector<T2> &diag, Functor gdeFunctor)
  {
      diag.resize(1);
      gdeFunctor( data[0], diag[0] );
  }

  template<typename T2>
  void GetDiagonalElements( std::vector<T2>& diag)
  {
     GetDiagonalElements(diag, GetDiagonalElementsFunc<T2>());
  }