Просто объявите параметр как имеющий ссылочный тип.
Например
template<class T>
void foo( const T &ar )
{
size_t n = sizeof(ar) / sizeof(ar[0]);
std::cout << n << std::endl;
for (int i = 0; i < n; i++)
std::cout << ar[i] << " ";
}
Или вы можете использовать следующее объявление
template<class T, size_t N>
void foo( const T ( &ar )[N] )
{
std::cout << N << std::endl;
for (int i = 0; i < N; i++)
std::cout << ar[i] << " ";
}
В противном случае функция имеет дело с указателем. В этом случае вам нужно указать второй параметр, который обозначает длину массива, например
template<class T>
void foo( const T* ar, size_t n )
{
std::cout << n << std::endl;
for (int i = 0; i < n; i++)
std::cout << ar[i] << " ";
}
Поскольку переданный массив не изменяется в функции, соответствующий параметр должен иметь квалификатор const
.
Обратите внимание на то, что в стандарте C ++ 17 введена стандартная функция std::size
, объявленная в заголовке <iterator>
, которую можно использовать вместо выражения sizeof(ar) / sizeof(ar[0])
Таким образом, вы можете написать например, в первой показанной функции
size_t n = std::size(ar)`;