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

Размер метаданных массива - это где-то в повышении?

Я нашел следующий шаблон на blog:

template <typename T, size_t N>
struct array_info<T[N]>
{
    typedef T type;
    enum { size = N };
};

Это изящная альтернатива sizeof(a) / sizeof(a[0]).

Обычно используемая конструкция для получения размера массива должна быть где-то в библиотеке. Я не знаю об этом. Может ли кто-нибудь сказать мне, что эта функциональность находится в стандартных библиотеках где-то и/или в Boost? Предпочтительно в простой и легкой форме.

4b9b3361

Ответ 1

В итоге я сам нашел ответ - boost::size():

#include <boost/range.hpp>

int array[10];
boost::size(array); // returns 10

Ответ 2

В новом стандарте С++ std:: array из заголовка имеет метод size(), который возвращает constexpr и поэтому доступен во время компиляции.

У вас должно быть что-то вроде

std::array< YourType, N > arr;
constexpr auto totalSize = arr.size() * sizeof( std::array< YourType, N >::value_type );

Надеюсь, что это поможет...

Ответ 3

Если возможно, я также рекомендовал бы std::array или boost::array, если это возможно. Тем не менее, вы можете также использовать boost:: extent для получения размеров массивов и boost:: remove_all_extents, чтобы получить фактический тип.

В С++ 11 характерные черты также доступны в стандартной библиотеке.

Изменить: Если вы ищете функцию, которая работает с переменными вместо типов, попробуйте выполнить следующие

template <typename T, std::size_t N>
std::size_t array_count(const T(&) [N]) { return N; }

См. пример использования http://ideone.com/IOdfp

Ответ 4

Вам нужен макрос _countof. Согласно http://www.cplusplus.com/forum/beginner/54241/, он # определен в <cstdio>. Но я не уверен, что он доступен вне Visual С++.

В любом случае, не сложно создать файл заголовка и разместить там свое определение.


Обновление:
_countof зависит от Microsoft, но здесь обсуждаются другие компиляторы: Эквиваленты для _countof от MSVC в других компиляторах