Удалить неуниверсальный параметр шаблона на C

Я использую ублас для своего матричного кода, но я хочу, чтобы он был заменяемым, поэтому я делал это:

typedef boost::numeric::ublas::matrix<double> cMatrix;

Сегодня мне нужно изменить некоторые из этих матриц на ограниченные размеры, поэтому у меня также будет это:

typedef boost::numeric::ublas::bounded_matrix<double, 3, 3> Matrix3d;

Проблема в том, что мое старое объявление функции:

void cClass::function(int param1,
                      int param2,
                      cMatrix &param3,
                      int param4);

Больше не работает. Это дает мне:

error : a reference of type "cMatrix &" (not const-qualified) cannot be initialized with a value of type "Matrix3d"

Мне удалось это исправить, изменив объявление на:

template <class A>
void cClass::function(int param1,
                      int param2,
                      boost::numeric::ublas::matrix<double, boost::numeric::ublas::row_major, A> &param3,
                      int param4);

Проблема в том, что мое определение - файл cpp, поэтому мне придется сделать что-то вроде этого в cpp:

void dummyFunc()
{
  cClass dummy(NULL, NULL);
  cMatrix c;
  Matrix12d d12;
  dummy.function(-1, -1, c, -1);
  dummy.function(-1, -1, d12, -1);
}

Есть ли какой-нибудь способ избежать использования dummyFunc или обобщения функции другим способом?

2 ответа

Если оба matrix а также bounded_matrix иметь точно такой же API, вы можете абстрагировать тип и обобщить cClass::function используя вариадические шаблоны:

template<template <class...> class M, class... Arg>
void cClass::function(int param1,
                      int param2,
                      M<Arg...> &param3,
                      int param4);

Я предлагаю это улучшение по сравнению с (правильным) ответом Тибо:

template<class UblasMatrix, typename /*Dummy*/ = UblasMatrix::array_type>
void cClass::function(int param1,
                      int param2,
                      UblasMatrix &param3,
                      int param4);

Благодаря SFINAE, второй аргумент шаблона просто (почти) уверен, что вы вызываете функцию с какой-то матрицей убласа, а не с чем-то другим (например, скажем, std::vector<doubel>). Это позволяет избежать запутанных сообщений об ошибках.

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