将非常量整数传递给 C++ 中的模板参数

foi*_*ois 2 c++ templates matrix

我想知道如何创建一个从命令行给出大小的矩阵。如果它是非模板矩阵类,则可以轻松完成。但是,如果矩阵类是模板类(如在 Eigen 中),我该如何创建一个从命令行给出大小的矩阵呢?

template<int _row, int _col>
class Matrix{
...
};

int main{
    // assign rows and cols dynamically
    int row;
    int col;
    std::cin >> row >> col;

    // Some procedures

    Matrix<row, col> m;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

谢谢@hyde 和@marcinj。我认为 Eigen 的实现背后有一些神奇的机制。通过再次查看 Eigen 的代码,我认为他们int _Cols, int _Rows仅对小矩阵使用模板参数,并定义Dynamic为 -1 之类的一些常量并在运行时处理它。

mar*_*inj 5

答案是你不能,模板是在编译时实例化的,所以在编译时也必须知道 row 和 col 。

你将不得不实现一个非模板化的 Matrix 类来实现你想要的。将 row/col 传递给构造函数并允许类为矩阵动态分配内存。

[编辑]

如果您想以与 Eigen 中类似的方式实现您的 Matrix,您将不得不研究它们的实现。在这里:

https://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html

您可以看到他们的模板化 Matrix 接受 row 和 col 作为模板参数,当参数具有某个指定值Dynamic(这可能是一些非常大的值,例如std::numeric_limits<unsigned int>::max()),则 Matrix 使用构造函数参数中提供的矩阵大小。

如果动态模板矩阵的代码应该有很大不同,那么您可以为其提供专业化。