C ++: шаблоны функций - PullRequest
       6

C ++: шаблоны функций

3 голосов
/ 10 октября 2011

У меня есть 2 2D массива, которые представляют лабиринт

const char maze1[10][11] а также const char maze2[20][21]

Я пытаюсь создать 1 функцию для обработки обоих лабиринтов следующим образом:

void solveMaze(maze[][])
{
}

и просто пройти лабиринт, как solveMaze(maze1);

Как бы я сделал это с шаблонами функций?

Недавно я уже задавал этот вопрос, но явно просил не использовать шаблоны функций, потому что я не был уверен в том, как его использовать, но хотел бы посмотреть, как он будет работать. (надеюсь, это не «злоупотребляет» системой)

Ответы [ 4 ]

3 голосов
/ 10 октября 2011

Прежде всего, было бы намного проще, если бы вы использовали лучшие массивы.Проблема с 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);
3 голосов
/ 10 октября 2011

Вам не нужно и не следует использовать шаблоны для решения этой проблемы.Все, что вы делаете, это решаете лабиринты разных размеров.

Шаблоны предназначены для генерации ряда классов / функций, использующих различные типы.

Вместо этого создайте класс для хранения лабиринта.Этот класс должен хранить размеры лабиринта и предоставлять доступ к компонентам этого лабиринта.

2 голосов
/ 10 октября 2011
template<int w, int h>
void solveMaze(const char (&maze)[w][h])
{
    //can use w,h now
} 
1 голос
/ 10 октября 2011

Реальная поддержка многомерных массивов отсутствует. Вы должны рассмотреть возможность использования класса с надлежащей поддержкой размеров. Следующее делает трюк

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...