如何声明一个通过引用传递多维数组的函数

时间:2014-01-15 18:46:26

标签: c++ arrays multidimensional-array

我有一个网格,我想传递给另一个显示它的函数。但是,我似乎无法弄清楚我将如何声明该函数,多维数组通过引用传递给该函数。

void foo(bool[][]&); //INCORRECT: how is a correct way to declare this function?

// rest of code :

int main(){
    bool grid[50][50] = {false};
    foo(grid);
    return 0;
}

void foo(bool& grid[][]){
    // do things
}

这应该是一个基本问题,但我在寻找解决方案时遇到了很多麻烦。

2 个答案:

答案 0 :(得分:6)

对2D数组类型的引用如下所示:

T (&)[N][M]

所以你想要:

void foo(bool(&)[50][50]);

请注意,必须指定尺寸。对于函数定义,它将如下所示:

void foo(bool (&grid)[50][50]) {

如果您需要能够将该功能用于各种尺寸的2D阵列,您可以将其作为尺寸上的模板:

template <std::size_t N, std::size_t M>
void foo(bool(&)[N][M]);

将为您传递给它的每个数组大小实例化模板。

答案 1 :(得分:1)

您可以使用以下其中一项:

void foo(bool(&grid)[][50]);
void foo(bool(&grid)[50][50]);

但是既然你非常幸运地使用C ++,那么你可以使用std::array来避免使用C语言:

void foo(std::array<std::array<bool, 50>, 50>&);

是的,它更长,但它更具描述性且易于记忆。如果你担心“表现”:

  

结构体结合了C风格的性能和可访问性   具有标准容器优点的数组,例如知道它   自己的大小,支持赋值,随机访问迭代器等。

猜猜是什么?你甚至可以为它创建一个模板化的别名:

template<class T, std::size_t M, std::size_t N = M> using biarray = std::array<std::array<T, M>, M>;

您可以在函数中使用:

void foo(biarray<bool, 50>&);
相关问题