Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Передача массива в функцию и range-based цикл

Весь мозг поломал, перечитал все об указателях и так и не понял как сделать этот код работоспособным. Как прямо сказать циклу что я ему подсовываю именно массив (а то он ругается что не найдена функция begin)?
void func (int * a) { for (auto n : a) { std::cout << n; } }
int main() {
int arr[] = { 4,7,3,4,7,8,9,0}; func(arr); }


Ответ

Поскольку вы передаете указатель (да даже если бы вы передали массив без указания размера - все равно передался бы указатель), таким образом - никак. Указатель не несет в себе никакой информации, кроме адреса. func никак не может узнать, где конец массива. Поскольку в вопросе именно range-based цикл, то тривиальную передачу указателя, количества элементов и обычный цикл не рассматриваем. Но и тут можно выкрутиться - с помощью шаблонов:
template void func(T (&a)[N]) { for (auto n : a) { std::cout << n << " "; } }
int main() {
int arr[] = { 4,7,3,4,7,8,9,0}; func(arr); }

Комментариев нет:

Отправить комментарий