Я вижу проблему в том, что вы объявляете три вещи:
template<class T>
void ax_plus_y(const T a, const Matrix<T, Dynamic, Dynamic>& x,
Matrix<T, Dynamic, Dynamic>& y);
template<>
void ax_plus_y<float>(const float a, const Matrix<float, Dynamic, 1>& x,
Matrix<float, Dynamic, 1>& y);
template<>
void ax_plus_y<double>(const double a, const Matrix<double, Dynamic, 1>& x,
Matrix<double, Dynamic, 1>& y);
Сигнатуры функций специализаций, которые используют Matrix<double, Dynamic, 1>
, не совпадают с сигнатурой общей функции, которая использует Matrix<double, Dynamic, Dynamic>
, поэтому компилятор не будет ассоциировать специализации с общим шаблоном. Я не думаю, что компилятор собирается перепрыгивать через неявные типы, чтобы сделать эту работу для вас.
РЕДАКТИРОВАТЬ: Что касается вашего общего вопроса "возможно ли": да, но это займет много усилий, и вы можете подумать о написании какой-то программы генерации кода, чтобы сохранить ты с ума сойдешь.
Я делал это несколько лет назад, но не с классами Matrix
или Vector
, а с парами const T*, size_t
. Моей целью было удобочитаемость (имена функций BLAS / LAPACK скорее краткость, чем ясность), поддержка других библиотек, таких как FFTW и SSE, и поддержка типов вне этих пакетов. Идея заключалась в том, что вы будете использовать общие процедуры, и это сгенерирует лучший код для вашей платформы. К сожалению, я не могу открыть его с открытым исходным кодом, и это десятилетие поддержки.
В вашем случае вам придется написать что-то вроде:
template<class T, long long D1=Dynamic, long long D2=Dynamic>
void ax_plus_y(const T a, const Matrix<T, D1, D2>& x, Matrix<T, D1, D2>& y) {
y += a * x;
}
template<long long D1=Dynamic>
void ax_plus_y<float, D1, 1>(const float a, const Matrix<float, D1, 1>& x, Matrix<float, D1, 1>& y) {
int n = x.size();
int incx = x.innerStride();
int incy = y.innerStride();
saxpy_(&n, &a, x.data, &incx, y.data(), &incy);
}
template<long long D2=Dynamic>
void ax_plus_y<float, 1, D2>(const float a, const Matrix<float, 1, D2>& x, Matrix<float, 1, D2>& y) {
int n = x.size();
int incx = x.outerStride();
int incy = y.outerStride();
saxpy_(&n, &a, x.data, &incx, y.data(), &incy);
}
и повторите для double
.