Страницы

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

пятница, 2 ноября 2018 г.

Передача статического одномерного массива определённого размера в функцию

Я хочу передать в функцию статический массив определённого размера, который будет проверяться при компиляции.
#include void print(int arr[3]) { std::cout << sizeof(arr) << '
'; //выводит 4 при каждом вызове for (int i = 0; i < 3; i++) { std::cout << arr[i] << ' '; } std::cout << '
'; }
int main() { int staticArr2[2] = {8, 5}; int staticArr3[3] = {2, 4, 7};
std::cout << sizeof(staticArr2) << '
'; //выводит 8 std::cout << sizeof(staticArr3) << '
'; //выводит 12
print(staticArr2); // выводит 3 элемент, указывающий на память вне массива // хочется чтобы не компилировалось print(staticArr3); // ок return 0; }
Но вот конструкция int arr[3] воспринимается как int * в объявлении входных параметров функции. Подскажите, как можно реализовать передачу массива конкретного размера.


Ответ

Можно воспользоваться шаблонами для того, чтобы передавать массив как массив, а не как указатель. При таком вызове сохраняется информация о размере массива. Если дополнить код вызовом static_assert, то ошибка будет выдаваться во время компиляции.
template void print(int (&arr)[N]) { static_assert(N == 3, "Array must contain 3 elements"); // Проверка выполняется // во время компиляции std::cout << N << ' ' << sizeof(arr) << '
'; // Размер вычисляется корректно for (int i = 0; i < 3; i++) { std::cout << arr[i] << ' '; } std::cout << '
'; }
При попытке передать массив из двух элементов будет выведена ошибка:
prog.cpp: In instantiation of 'void print(int (&)[N]) [with unsigned int N = 2u]': prog.cpp:22:21: required from here prog.cpp:6:2: error: static assertion failed: Array must contain 3 elements static_assert(N == 3, "Array must contain 3 elements"); ^

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

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