2011-10-10 115 views
3

我有2个二维数组表示迷宫C++:函数模板

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

我试图创建1个函数来处理两个迷宫像这样:

void solveMaze(maze[][]) 
{ 
} 

,只是通过迷宫solveMaze(maze1);

如何使用函数模板来做到这一点?

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

+0

我不认为这可以通过模板来完成。如果你想要一个char迷宫或者int迷宫或者一个浮动迷宫,你会使用模板,但是不仅仅是具有不同尺寸的char迷宫。 –

+2

@ChadSchouggins:实际上,数组维度可以是模板参数。规范的例子是获得数组大小的模板函数:'template size_t size(T(&)[N]){return N; ''。语法虽然是神秘的。 –

+0

@codeCube:它可能是有意义的,因为模板参数是常量,这可以允许编译器对某些大小进行特定的优化。这里值得怀疑,但有一天可能会有所帮助。 –

回答

1

有多维数组没有真正的支持。您应该考虑使用适当支持尺寸的课程。以下是卓有成效的

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; 
} 
+0

非常有趣。出于好奇,为什么你将这些变量传递给main?他们需要这个吗? – dukevin

+0

@dukevin哪个变量 - argc和argv?这些都没有必要 - 这是我的IDE认为主要应该是这样的:P –

3

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

模板用于生成许多使用各种类型的类/函数。

而是构建一个类来存储迷宫。这门课应该存储迷宫的片段,并给出迷宫的组成部分。

3

首先,如果您使用的是更好的阵列,它会简单得多。 C阵列的问题在于它们容易衰减指针,一旦它们发生变形,尺寸就会丢失(而且,亲爱的,就我而言,它非常愚蠢......)

的选择则取决于你是否有固定大小的数组或要动态调整大小的数组:

  • 为固定大小:std::array(或者,如果不可用boost::array
  • 用于动态尺寸:std::vector

由于模板将在std::array的情况下更有意义,我会假设这是你选择的。

char const maze1[10][11] 

相当于

std::array<std::array<char, 11>, 10> const maze1 

这是稍微详细,但std::array提出正式会员的方法,如.size().begin().end(),等等...,它可以在功能很容易地通过。

现在,你的模板功能。该签名将仅仅是:

template <size_t M, size_t N> 
void solveMaze(std::array<std::array<char, N>, M> const& maze); 

然而,尽管你的问题,你更有可能想要在这里不使用模板(它们是小的好处)。所以,我会建议使用vector和常规功能:

void solveMaze(std::vector< std::vector<char> > const& maze); 
2
template<int w, int h> 
void solveMaze(const char (&maze)[w][h]) 
{ 
    //can use w,h now 
}