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

时间:2016-05-20 09:41:49

标签: 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;
}

编辑:

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

1 个答案:

答案 0 :(得分:4)

答案是你不能,模板在编译时被实例化,因此在编译时也必须知道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使用矩阵构造函数参数中提供的大小。

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