[英]C++: Function templates
我有2個代表迷宮的2D陣列
const char maze1[10][11]
和const char maze2[20][21]
我正在嘗試創建1個函數來處理這兩個迷宮:
void solveMaze(maze[][])
{
}
並像solveMaze(maze1);
一樣傳遞迷宮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
它稍微冗長一點,但是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);
template<int w, int h>
void solveMaze(const char (&maze)[w][h])
{
//can use w,h now
}
對多維數組沒有真正的支持。 您應該考慮使用具有適當尺寸支持的類。 以下是訣竅
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.