Функтор со значением по умолчанию в качестве параметра в функции в контексте шаблонного класса и функции :-)

Ингредиенты:

  1. Класс-матрица, созданный по шаблону для типа элемента-матрицы, предназначенный для работы с подматрицами, а также с двойными / плавающими и т. Д.

  2. Метод-член матрицы, который возвращает "истинную" диагональ, то есть в случае подматриц NxN диагонали тех, то есть вектор векторов размера N.

  3. Как можно меньше ограничений относительно реализации субматриц и никаких ненужных «побочных эффектов» / требований, когда субматрицы не используются, а, скажем, просто удваиваются.

  4. Бесшовное использование класса матрицы в каком-либо алгоритме, например сопряженный градиент, который в идеале должен быть просто основан на каком-то общем матричном и векторном типе.

Идея заключалась в том, чтобы предоставить функтор для 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.

Угадайте, что функтор, так как аргумент-шаблон не нужен - я пробовал, но не смог заставить его работать, вероятно, простой (?), Хотя любая помощь приветствуется, с уважением, Дерик.

PS: В идеале, по возможности, без лишних / промежуточных вспомогательных типов. Нет Boost, нет C ++ 11.

Дополнительный вопрос: что, если бы я хотел сделать то же самое, но указать функтор диагонального доступа как часть объявления-шаблона-матрицы (?), Как?


person Dr.D.    schedule 20.03.2013    source источник


Ответы (1)


Вы не можете использовать параметры шаблона по умолчанию в функциях в 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>());
  }
person ForEveR    schedule 20.03.2013