"Переменные" в шаблонах с++
Всем здравствуйте. Недавно заинтересовался как же работает std::end и когда пошёл смотреть реализацию, увидел там приблизительно вот такой код(просто сейчас не могу посмотреть):
template<typename T, size_t sz> constexpr end( T (&arr)[sz])
{
return arr+sz;
}
Насколько я понял sz отвечает за размер массива, но почему то оно определенно не обычной переменной, а как-то в шаблоне. Что это за магическая "переменная" которую определяют в шаблоне и для чего она нужна?
Ответы (1 шт):
Это не переменная, а параметр шаблона. Когда компилятор встречает в коде 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.
Этот шаблон работает только для массивов фиксированного размера:
- для переменной, объявленной как
int somevar[] = {1,2,3,4,5,6,7,8,9, 10}, - а также для переменной с типом
массив фиксированного размера:
typedef int IntArray16[16];
IntArray16 arr;