Ответ 1
В итоге я сам нашел ответ - boost::size()
:
#include <boost/range.hpp>
int array[10];
boost::size(array); // returns 10
Я нашел следующий шаблон на blog:
template <typename T, size_t N>
struct array_info<T[N]>
{
typedef T type;
enum { size = N };
};
Это изящная альтернатива sizeof(a) / sizeof(a[0])
.
Обычно используемая конструкция для получения размера массива должна быть где-то в библиотеке. Я не знаю об этом. Может ли кто-нибудь сказать мне, что эта функциональность находится в стандартных библиотеках где-то и/или в Boost? Предпочтительно в простой и легкой форме.
В итоге я сам нашел ответ - boost::size()
:
#include <boost/range.hpp>
int array[10];
boost::size(array); // returns 10
В новом стандарте С++ std:: array из заголовка имеет метод size(), который возвращает constexpr и поэтому доступен во время компиляции.
У вас должно быть что-то вроде
std::array< YourType, N > arr;
constexpr auto totalSize = arr.size() * sizeof( std::array< YourType, N >::value_type );
Надеюсь, что это поможет...
Если возможно, я также рекомендовал бы 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
Вам нужен макрос _countof
. Согласно http://www.cplusplus.com/forum/beginner/54241/, он # определен в <cstdio>
. Но я не уверен, что он доступен вне Visual С++.
В любом случае, не сложно создать файл заголовка и разместить там свое определение.
Обновление: _countof
зависит от Microsoft, но здесь обсуждаются другие компиляторы: Эквиваленты для _countof от MSVC в других компиляторах