传递到具有不同尺寸的两个维度的相同函数矩阵

时间:2015-07-12 12:29:34

标签: c++ matrix const

我有两个不同尺寸的常数矩阵,比如说

const int denoise[][3] = {...}

const int deconv[][4] = {...}

然后我定义了像void handleMatrix(const int* const*){...}这样的函数,希望能够处理这些矩阵。但这是不正确的。

我尝试过的一项努力就是使用如下模板:

template<typename Ty> void handle Matrix(const Ty m){...}

它在vs2013上完美运作。

但是如何在不使用模板的情况下将这些矩阵传递给函数?

2 个答案:

答案 0 :(得分:2)

您应该使用typedef,这样您就不必使用任何糟糕的语法:

using matrix_t = int[3][3];

你应尽可能通过引用传递你的args:

void handle_matrix(const matrix_t &mat){
    // do something with 'mat'
}

如果您想使用没有typedef的原始语法:

void handle_matrix(const int (&mat)[3][3]){
    // ...
}

如果你想使用原始语法并通过指针传递:

void handle_matrix(const int (*mat)[3]){
    // ...
}

但是你失去了类型安全性,所以我建议你不要使用最好的选项:typedef并通过引用传递。

修改

你在评论@Kerrek SB的回答中说你的矩阵会有不同的大小。

所以这里是如何处理它并仍然保持好方法:

template<size_t Columns, size_t Rows>
using matrix_t = int[Columns][Rows];

template<size_t Columns, size_t Rows>
void handle_matrix(const matrix_t<Columns, Rows> &mat){
    // ...
}

考虑到我假设您可以在我的回答中使用C ++ 14,如果您发表评论我可以为任何其他版本修改它。

答案 1 :(得分:1)

您的矩阵是int[3] s的数组。如果你想要传递C风格的参数,你将传递一个指针,该数组的第一个元素加上一个大小:

using Row = int[3];

void foo(const Row * p, std::size_t n_cols)
{
    for (std::size_t i = 0; i != n_cols; ++i)
    {
        for (int n : p[i]) { std::cout << n << ' '; }
        std::cout << '\n';
    }
}

用法示例:

Row * matrix = new Row[40]();
foo(matrix, 40);
delete [] matrix;

使用类型变量:

Row matrix[] = { {1,2,3}, {2,3,4} };
foo(matrix, std::distance(std::begin(matrix), std::end(matrix)));