Специализация функции C ++ для одинаковых параметров - PullRequest
2 голосов
/ 07 ноября 2011

Я, как и многие другие, пишу библиотеку линейной алгебры для личного пользования.При этом я пытаюсь узнать больше о программировании с помощью шаблонов на C ++.У меня есть класс, который выглядит примерно так:

template<typename T, size_t N, size_t M = N>
class Matrix
{
    ...
}

Теперь есть определенные операции, которые я хотел бы ограничить квадратными матрицами (определитель, например).Но когда я пытаюсь добавить:

T Determinant<T,N,N>();

Не удается скомпилировать, с ошибкой «Отсутствует»;до «<».Я попытался добавить еще один шаблон над определителем вызова, но безуспешно.Любые советы о том, как этого добиться, будут очень благодарны. </p>

Ответы [ 4 ]

4 голосов
/ 07 ноября 2011

К сожалению, вы не можете специализировать функцию для определенных параметров шаблона, как это, вы должны сделать весь класс.Поскольку вы не хотите перекодировать весь объект, вы, вероятно, хотите использовать наследование.

//shared code
template<typename T, size_t N, size_t M>
class BaseMatrix
{
    //existing code
};

// non-square general case
template<typename T, size_t N, size_t M=N>
class Matrix : public BaseMatrix<T,N,M>
{
    //forwarding headers
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
};

//square matrix specialization
template<typename T, size_t N>
class Matrix : public BaseMatrix<T,N,N>
{
    //forwarding headers
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {}
    T Determinant();
};
3 голосов
/ 07 ноября 2011

Теперь есть некоторые операции, которые я хотел бы ограничить квадратными матрицами (например, определителем).

Вы имеете в виду свободную функцию, подобную этой:

template< typename T, std::size_t N >
T determinant( Matrix< T, N, N > const& m ){ ... }

или вы имеете ввиду это как ученики?Если вам нужен член класса, вам лучше переместить все обычные функции в базовый класс и использовать специализацию шаблонов для Matrix, чтобы включить дополнительную функциональность для квадратных матриц.

0 голосов
/ 07 ноября 2011

Я поддерживаю идею базового класса. Иметь класс Matrix и подкласс SquareMatrix. Объявите метод Determinant в классе SquareMatrix и смело предполагайте, что матрица квадратная, не имея дело с шаблонами Детерминантный метод будет проще, как и код, который его вызывает.

0 голосов
/ 07 ноября 2011

Вы должны объявить переменную следующим образом: Matrix<float, 10, 10> myMatrix;.

...