C++ C++;:函数模板

C++ C++;:函数模板,c++,arrays,templates,function,C++,Arrays,Templates,Function,我有两个二维数组,代表一个迷宫 const char maze1[10][11] 和 const char maze2[20][21] 我尝试创建一个函数来处理两个迷宫,如下所示: void solveMaze(maze[][]) { } 然后像solveMaze(maze1)一样通过迷宫 我如何使用函数模板来实现这一点 我最近已经问过这个问题,但明确要求不要使用函数模板,因为我不确定如何使用它,但我想看看它将如何工作。(希望这不是“滥用”系统)您不需要也不应该使用模板来解决此问题。你所做的就

我有两个二维数组,代表一个迷宫

const char maze1[10][11]
const char maze2[20][21]

我尝试创建一个函数来处理两个迷宫,如下所示:

void solveMaze(maze[][])
{
}
然后像
solveMaze(maze1)一样通过迷宫

我如何使用函数模板来实现这一点


我最近已经问过这个问题,但明确要求不要使用函数模板,因为我不确定如何使用它,但我想看看它将如何工作。(希望这不是“滥用”系统)

您不需要也不应该使用模板来解决此问题。你所做的就是解决不同大小的迷宫

模板用于生成大量使用各种类型的类/函数


而是构造一个类来存储迷宫。这个类应该存储迷宫的尺寸,并允许访问迷宫的组件。

首先,如果使用更好的数组,它会简单得多。C数组的问题是,它们很容易衰减为指针,一旦衰减,大小就会丢失(亲爱的,就我而言,这是相当愚蠢的…)

然后,选择取决于您是拥有固定大小的阵列还是想要动态大小的阵列:

  • 对于固定大小:
    std::array
    (或者如果不可用
    boost::array
  • 对于动态大小:
    std::vector
由于模板在
std::array
的情况下更有意义,我想这就是您选择的模板

char const maze1[10][11]
相当于

std::array<std::array<char, 11>, 10> const maze1
然而,尽管您提出了问题,但您更可能不希望在这里使用模板(它们没有什么好处)。因此,我建议使用
向量
和正则函数:

void solveMaze(std::vector< std::vector<char> > const& maze);
void-solveMaze(std::vectorconst&maze);

对多维数组没有真正的支持。你应该考虑使用一个对维度有适当支持的类。下面的方法可以实现这一目的

template<int N, int M>
void solveMaze(const char (&maze)[N][M]) {
    size_t n = N;
    size_t m = M;
    int x = 0;
}

int main(int argc, char *argv[])
{
    const char maze[3][2] = { { 0, 1} , {2, 3}, {4, 5} };
    solveMaze(maze);
    return 0;
}
模板
无效解算迷宫(常量字符和迷宫)[N][M]){
尺寸n=n;
尺寸m=m;
int x=0;
}
int main(int argc,char*argv[])
{
const-char-maze[3][2]={0,1},{2,3},{4,5};
迷宫;
返回0;
}
模板
无效解算迷宫(常量字符和迷宫)[w][h])
{
//现在可以使用w,h了吗
} 

我认为这不能通过模板实现。如果需要字符迷宫、整型迷宫或浮点迷宫,则可以使用模板,而不仅仅是具有不同维度的字符迷宫。@ChadSchouggins:实际上,数组维度可以是模板参数。典型示例是获取数组大小的模板函数:
template size\u t size(t(&)[N]){return N;}
。语法很神秘。@codeCube:这可能有意义,因为模板参数是常量,这可能允许编译器对某些大小执行特定的优化。这一点值得怀疑,但总有一天会有所帮助。@codeCube:你说得不完全正确。我可以考虑一些情况,其中您希望使用整数常量作为模板参数。这个例子是一个模板化的任意大小的位字段类。非常有趣。出于好奇,为什么要将这些变量传递给main?这需要它们吗?@dukevin哪些变量-argc和argv?这些都不是必需的——这是我的IDE认为main应该是什么样子的:P
template<int N, int M>
void solveMaze(const char (&maze)[N][M]) {
    size_t n = N;
    size_t m = M;
    int x = 0;
}

int main(int argc, char *argv[])
{
    const char maze[3][2] = { { 0, 1} , {2, 3}, {4, 5} };
    solveMaze(maze);
    return 0;
}
template<int w, int h>
void solveMaze(const char (&maze)[w][h])
{
    //can use w,h now
}