"Переменные" в шаблонах с++

Всем здравствуйте. Недавно заинтересовался как же работает std::end и когда пошёл смотреть реализацию, увидел там приблизительно вот такой код(просто сейчас не могу посмотреть):

template<typename T, size_t sz> constexpr end( T (&arr)[sz])
{
   return arr+sz;
}

Насколько я понял sz отвечает за размер массива, но почему то оно определенно не обычной переменной, а как-то в шаблоне. Что это за магическая "переменная" которую определяют в шаблоне и для чего она нужна?


Ответы (1 шт):

Автор решения: Pak Uula

Это не переменная, а параметр шаблона. Когда компилятор встречает в коде std::end(some_array), он ищет подходящую сигнатуру.

Если some_array имеет тип SomeType[n] - массив типа SomeType с n элементами, то компилятор инстанциирует шаблон template< class T, std::size_t N > constexpr T* end( T (&array)[N] ) noexcept;, связав тип SomeType с параметром T, а число элементов n свяжет с параметром sz.

Этот шаблон работает только для массивов фиксированного размера:

  1. для переменной, объявленной как int somevar[] = {1,2,3,4,5,6,7,8,9, 10},
  2. а также для переменной с типом массив фиксированного размера:
typedef int IntArray16[16];
IntArray16 arr;
→ Ссылка