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

标签 c++ templates

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

//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/

相关文章:

c++ - 游戏引擎中的对象层次结构实现

c++ - MFC 无法识别文件类型

c++ - 当使用 vector 数学将某物移动到一个点时,敌人到达那里然后消失

c++ - GCC 无法正确解析 std::accumulate

c++ - 每当成员变量可以由可变参数构造时,有条件地启用构造函数

c++ - 在 C++ 中使用两个 if 有区别吗

Django urlencode 模板过滤器

c++ - 实例化错误后成员函数模板的特化,以及成员函数的顺序

c++ - 用于优化存储/运行时算法的元编程,C++

email - 是否可以为 mailchimp 编写拖放模板?