Подтвердить что ты не робот

Как узнать размер массива const?

с учетом следующего кода:

const myStr codesArr[] =  {"AA","BB", "CC"};     

myStr - это класс wraps char*. Мне нужно перебрать все элементы в массиве, но я не знаю количества элементов. Я не хочу определять значение const, которое будет представлять размер (в этом случае 3)

Можно ли использовать что-то вроде:

const int size = sizeof(codesArr) / sizeof(myStr);

что делать?

4b9b3361

Ответ 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, является единственным методом, позволяющим использовать результат операции как размер другого массива (поскольку его константа времени