Если вы хотите использовать массив, а не указатель, тогда вы можете написать шаблон функции следующим образом:
template <typename T, size_t N>
void printArray(T (&start)[N])
{
int i = 0;
while ( i < N) {
std::cout << start[i] << std::endl;
i++;
}
}
int xs1[] = {1,2,3,4,5,6,7};
int xs2[] = {1,0,3,6,7};
printArray(xs1); //okay
printArray(xs2); //okay
int *start = xs1;
printArray(start); //error - cannot pass pointer anymore!
Так что лучшим решением будет: std::vector<T>
.
Или даже лучшеиспользуйте диапазон (пара итераторов) , что очень идиоматично, так как:
template <typename FwdIterator>
void printArray(FwdIterator begin, FwdIterator end)
{
while (begin != end) {
std::cout << *begin << std::endl;
begin++;
}
}
int xs1[] = {1,2,3,4,5,6,7};
int xs2[] = {1,0,3,6,7};
printArray(xs1, xs1 + sizeof(xs1)/sizeof(xs1[0])); //okay
printArray(xs2, xs2 + sizeof(xs2)/sizeof(xs2[0])); //okay
int *start = xs1;
printArray(start, start + sizeof(xs1)/sizeof(xs1[0])); //okay!
printArray
теперь можно использовать с std::vector<T>
также:
std::vector<int> vec; //you can use std::list as well!
//populate vec
printArray(vec.begin(), vec.end());