Параметры в шаблонах c ++ - PullRequest
3 голосов
/ 03 апреля 2011

Пример шаблона функции

template<typename T, int n>
T max(T (&arr)[n])
{
   T maxm = arr[0];
   for(int i = 1; i <n; ++i)
      if (maxm < arr[i])
       maxm = arr[i];

   return maxm;
}

Является ли arr также параметром типа, например T ?

Ответы [ 4 ]

5 голосов
/ 03 апреля 2011

arr - это имя параметра функции.Это не параметр типа.Его тип является ссылкой на массив типа элемента T и длины n.

1 голос
/ 03 апреля 2011

arr - это обычный параметр функции, который передается переменной при вызове функции.

Однако тип этого аргумента *1004* используется для определения T и n, которые являются параметрами шаблона.Таким образом, arr используется для связывания аргумента функции с аргументами шаблона.

Этот процесс называется вывод типа .

1 голос
/ 03 апреля 2011

Является ли arr также параметром типа, например T?

Нет arr является параметром вызова.Это не параметр типа и не типовой параметр

0 голосов
/ 04 апреля 2011

arr - это параметр функции, тип которого выводится из T и n.

Подумайте об изменении кода на:

template<typename T, int n>
T max(T (&arr)[n])
{
   T* maxel = &(arr[0]);
   for(int i = 1; i <n; ++i)
      if (*maxel < arr[i])
       maxel = &(arr[i]);

   return *maxel;
}

В вашей версии, если выЯ дам некоторый массив объектов, которые будут увеличиваться при увеличении индекса каждый раз, когда будет вызываться копия ctor - и это может быть как-то дорого, в зависимости от типа T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...