Я хочу передать в функцию статический массив определённого размера, который будет проверяться при компиляции.
#include
'; //выводит 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
'; // Размер вычисляется корректно
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");
^
Комментариев нет:
Отправить комментарий