Шаблонная специализация для классов Eigen3 - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь реализовать шаблоны для работы с матрицами и массивами 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 ]

0 голосов
/ 28 октября 2018

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

На выходных я взглянул на ваши предложения и, наконец, пришел к решению, которое компилируется в 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 ++, я должен признать, что удивлен тем, насколько трудным (по крайней мере для меня ...) было достижение такой относительно простой задачи. Думаю, мне еще предстоит пройти долгий путь ...: -)

0 голосов
/ 26 октября 2018

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

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

...