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

310
11 января 2017, 01:53

Весь мозг поломал, перечитал все об указателях и так и не понял как сделать этот код работоспособным. Как прямо сказать циклу что я ему подсовываю именно массив (а то он ругается что не найдена функция 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);
}
Answer 1

Поскольку вы передаете указатель (да даже если бы вы передали массив без указания размера - все равно передался бы указатель), таким образом - никак. Указатель не несет в себе никакой информации, кроме адреса. func никак не может узнать, где конец массива.
Поскольку в вопросе именно range-based цикл, то тривиальную передачу указателя, количества элементов и обычный цикл не рассматриваем.
Но и тут можно выкрутиться - с помощью шаблонов:

template<typename T, size_t N>
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);
}
Answer 2

@Harry. Стоит отметить, что в Вашем, очень изящном решении, в функцию передается не указатель на массив (как в исходном вопросе), а ссылка на массив известного размера. Именно такую рекомендацию дает Страуструп в четвертом издании своей книги (12.2.2, page 318):

If you really want to pass an array, rather than a container or a pointer to the first element of an array, you can declare a parameter of type reference to array.

Если не использовать шаблоны, то получим набор перегруженных функций - по одной на каждый размер передаваемого массива (и каждого типа массива). В предложенном же решении размер массива, передаваемого в функцию, будет известен в результате выполнения процедуры конкретизации (instantiation) шаблона функции.

READ ALSO
Как собрать библиотеки WebM для MinGW

Как собрать библиотеки WebM для MinGW

Стоит задача реализовать в приложении на C++ потоковое видео (для браузеров), дали направление - WebMНа официальном сайте куча репозиториев (кодеки,...

317
Установка библиотек QT creator в Astra Linux

Установка библиотек QT creator в Astra Linux

Всем приветМне необходимо работать в Астра-Линукс и разрабатывать в нем приложения

1435
Получение текста событий из Event Log&#39;a в Windows

Получение текста событий из Event Log'a в Windows

Имеется не плохой пример от Microsoft по работе с Event Log, но проблема в том что текста самих событий он не выдаётКак можно получить текст событий?

457
Работа с классами и sfml

Работа с классами и sfml

Имеется класс button, который будет являться кнопкой в приложенииИспользуется вот так:

362