如何在C ++中正确返回模板化对象?

时间:2014-02-18 20:00:12

标签: c++ templates c++11

在此代码create_matrix中返回Matrix<int, 2, 3>类型:

#include <array>
#include <iostream>

using namespace std;

template <class T, size_t ROW, size_t COL>
using Matrix = array<array<T, COL>, ROW>;

Matrix<int, 2, 3> create_matrix(int x, int y){
    Matrix<int, 2, 3> arr;
    arr[0][0] = 42;
    return arr;
}

int main(int argc, char *argv[])
{
    auto arr = create_matrix(2,3);
    cout << arr[0][0];
    return 0;
}

是否可以返回Matrix<int, x, y>类型?

2 个答案:

答案 0 :(得分:3)

std :: array的模板参数必须在编译时知道(在编译时已知的文字值,const值或constexpr值)

因此,在这种情况下,无法在运行时返回带有x和y的矩阵。

要获得这种类型的功能,您可能需要将std :: array替换为std :: vector或类似的动态数组类型的对象,即使这样,您也必须重新构造代码,不要将值作为模板参数

答案 1 :(得分:1)

看起来像XY problem.

你可以将一个2D“矩阵”与vector<vector<int>>混在一起,但这有点像六角形一样重新投射轮子(意思是:表现极差)。

我建议您尝试使用线性代数库,例如ArmadilloEigen