Шаблонная специализация для классов Eigen3

Я пытаюсь реализовать шаблоны для работы с матрицами и массивами Eigen3. Как правило, моя реализация работает нормально, но я не могу расширить свою реализацию с помощью шаблонизации, чтобы иметь возможность использовать типы Eigen3 или стандартные числовые типы (например, int, float, ...).

Это сокращенная версия моего текущего кода:

#include <Eigen/Dense>
using namespace Eigen;

template<typename T>
void myFunc(Eigen::MatrixBase<T>& matrix)
{
  cout << "Eigen type" << endl;
}
template<typename T>
void myFunc(T& matrix)
{
  cout << "numeric type" << endl;
}

void main (void)
{
  int var=9;
  Eigen::Matrix<double,1,1> mat;

  myFunc(mat);  // This should uset the first template, but it doesn't !
  myFunc(var);
}

Это хорошо компилируется, но когда я запускаю это, оба вызова myFunc будут направлены на второй шаблон (-> "числовой тип"), что, конечно, не то, чего я хочу достичь.

Любые советы по решению этой проблемы будет принята с благодарностью.

Себастьян

PS: Использование MSVC 2012

2 ответа

Решение

Вторая функция выбрана потому, что она лучше соответствует первой при создании с Eigen::Matrix<double,1,1> как T, Вам нужно ограничить вторую функцию, чтобы она действовала только для тех типов, которые вы намереваетесь. Посмотри на std::enable_if примеры на этой странице в точности соответствуют тому, что вы хотите.

Если вы хотите узнать больше и посмотрите на SFINAE в целом, это то, что std::enable_if делает.

Прежде всего благодаря вашему быстрому ответу.

На выходных я взглянул на ваши предложения и, наконец, пришел к решению, которое компилируется в VS2012, а также в более новых версиях компилятора gcc (протестировано онлайн...). В приведенном выше коде я изменил второй шаблон на следующий:

template<typename T,
          typename std::enable_if<std::is_arithmetic<Derived>::value >::type* dummy = 0>
void myFunc(T& var)
{
  cout << "numeric type" << endl;
}

Не будучи опытным программистом на C++, я должен признать, что удивлен тем, как трудно (по крайней мере, для меня...) было достичь такой относительно простой задачи. Думаю, мне еще предстоит пройти долгий путь...:-)

Другие вопросы по тегам