0

这些成分:

  1. 以矩阵元素类型为模板的矩阵类,旨在与子矩阵以及双精度/浮点数等一起使用。

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

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

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

这个想法是为矩阵的 GetDiagonalElements() 方法提供一个仿函数,该方法具有一个仅复制对角元素的默认值。忽略矩阵的实际大小(仅 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”的模板参数

猜猜函子不需要模板参数 - 我试过但也没有让它工作,可能很简单(?),尽管任何帮助表示赞赏,亲切的问候,德里克。

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

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

4

1 回答 1

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>());
  }
于 2013-03-20T12:13:38.240 回答