Я работаю над шаблоном матрицы и в настоящее время работаю с функцией определителя шаблона.Это рекурсивная функция, которая находит определитель каждой субматрицы вплоть до базового случая и добавляет / вычитает каждый из этих субопределителей вместе.Вот функция:
//Determinant - Only square matrices have a determinant
template <typename T, std::size_t size>
T Determinant(Matrix<T, size, size> &mat)
{
ASSERT(size >= 2, "Wtf? 1x1 matrix?")
T determinant = {};
//Base case - Smallest size of matrix we can calculate the determinant is 2x2
if (size == 2)
{
return ((mat.m_data[0][0] * mat.m_data[1][1]) - (mat.m_data[0][1] * mat.m_data[1][0]));
}
else //otherwise, we need to grab the sub matrix within the current matrix and get the determinate of those.
{
Matrix<T, size - 1, size -1 > subMatrix;
//Note: We're filling in the new sub matrix column order
for (int topRow_ColumnIndex = 0; topRow_ColumnIndex < size; ++topRow_ColumnIndex)
{
int newSubCol = 0;
for (int subCol = 0; subCol < size; ++subCol)
{
int newSubRow = 0;
if (subCol == topRow_ColumnIndex)
{
continue;
}
//Sub matrices will start one row below the top row.
for (int subRow = 1; subRow < size; ++subRow)
{
subMatrix[newSubCol][newSubRow] = mat[subCol][subRow];
++newSubRow;
}
++newSubCol;
}
determinant = determinant + (T)pow(-1, topRow_ColumnIndex) * mat.m_data[topRow_ColumnIndex][0] *Determinant(subMatrix);
}
}
return determinant;
}
У меня проблема с частью шаблона этого.В частности, эта часть кода:
Matrix<T, size - 1, size - 1 > subMatrix;
. Это предназначено для создания матрицы с размерами, которые соответствуют подматрице (которая на 1 меньше текущей).
Происходит то, что создается экземпляр этого конкретного шаблона:
Matrix<float, 0, 0>
, что не годится, поскольку базовые данные в матрице являются массивом, и мы не можем иметь массивы нулевой длины.
1) Есть ли способ предотвратить создание экземпляра этого конкретного шаблона?
2) Возможно, глупый вопрос, но я вызываю эту функцию с переданным Matrix3x3. Почему компилятор создает каждый шаблон с размером от 3 до 0?(Объяснение низкого уровня было бы здорово, если это возможно)