gpt4 book ai didi

c++ - 如何防止模板类的实例化?

转载 作者:行者123 更新时间:2023-11-30 03:19:10 26 4
gpt4 key购买 nike

我正在研究模板化矩阵类,目前正在研究模板行列式函数。这是一个递归函数,它找到每个子矩阵的确定性一直到基本情况,并将这些子确定性中的每一个加/减在一起。这是函数:

//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? (如果可能的话,一个低层次的解释会很好)

最佳答案

你可以专攻Determinant<T, 1>所以它不会创建 Matrix<T, 0, 0> .

template <typename T>
T Determinant<T, 1> (Matrix<T, 1, 1> &mat) {
// Implementation here
// Avoid Matrix<T, 0, 0>
}

您还可以专攻Determinant<T, 2>所以你可以删除 if else在内部,因为检查模板变量最好在编译时完成。

template <typename T, std::size_t size>
T Determinant<T, size> (Matrix<T, size, size> &mat) {
// original "else" part here
}

template <typename T>
T Determinant<T, 2> (Matrix<T, 2, 2> &mat) {
return ((mat.m_data[0][0] * mat.m_data[1][1]) - (mat.m_data[0][1] * mat.m_data[1][0]));
}

关于c++ - 如何防止模板类的实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53939683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com