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