Как узнать размер массива const?
с учетом следующего кода:
const myStr codesArr[] = {"AA","BB", "CC"};
myStr - это класс wraps char*
.
Мне нужно перебрать все элементы в массиве, но я не знаю количества элементов.
Я не хочу определять значение const
, которое будет представлять размер (в этом случае 3)
Можно ли использовать что-то вроде:
const int size = sizeof(codesArr) / sizeof(myStr);
что делать?
Ответы
Ответ 1
Вы можете использовать int size = sizeof(codesArr) / sizeof(myStr);
, пока вы не передадите его в качестве параметра функции, потому что тогда массив распадается на указатель и потеряет информацию о размере.
Вы также можете использовать шаблонный трюк:
template<typename T, int sz>
int size(T(&)[sz])
{
return sz;
}
Ответ 2
Безопасный и понятный способ сделать это - использовать std::extent
(начиная с С++ 11):
const size_t size = std::extent<decltype(codesArr)>::value;
Ответ 3
Лучший способ (pre С++ 11), чтобы получить размер массива, указан в этой ссылке. Это запутанный шаблонный трюк, но имеет много преимуществ по сравнению с другими подходами, как описано в приведенной выше ссылке. Метод состоит в использовании следующей макрокоманды:
template <typename T, size_t N>
char ( &_ArraySizeHelper( T (&array)[N] ))[N];
#define countof( array ) (sizeof( _ArraySizeHelper( array ) ))
Его преимущества, среди прочего, заключаются в том, что это просто время компиляции, что лучше, чем выполнение этого во время выполнения, и до С++ 11 constexpr, является единственным методом, позволяющим использовать результат операции как размер другого массива (поскольку его константа времени