c++ - 如何将非常量 int 作为模板参数传递?

标签 c++ templates matrix non-type-template-parameter

我想知道如何创建一个大小由命令行给出的矩阵。如果它是非模板矩阵类,则可以简单地完成。但是,如果矩阵类是模板类(如 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 这样的常量并在运行时处理它。

最佳答案

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

您将必须实现一个非模板化的 Matrix 类才能实现您想要的。将行/列传递给构造函数并允许类动态为矩阵分配内存。

[编辑]

如果您想以与 Eigen 类似的方式实现 Matrix,您也需要研究它们的实现。在这里:

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

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

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

关于c++ - 如何将非常量 int 作为模板参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37343291/

相关文章:

c++ - 如何将程序输出重定向为输入

c++ - 在 Windows 7 上运行应用程序时未加载 OpenCV ffmpeg DLL,适用于 8 和 10

c++ - 模板生成一百个C回调函数,编译不慢

c++ - 扩展包含 int 包的类型

c++ - 为什么模板只能在头文件中实现?

c++ - 父类成员函数使用子类c++的实例

使用 CUDA 进行矩阵转置

c# - 根据关键字剪切音频文件

c++ - 如何构造具有构造函数参数的对象 vector ?

python - 矩阵除以另一个矩阵的行,在 theano 中没有循环