Метафункция размера массива - это где-то в boost? - PullRequest
14 голосов
/ 24 ноября 2011

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

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

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

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

Ответы [ 5 ]

26 голосов
/ 25 ноября 2011

Я в конце концов нашел ответ сам - boost::size():

#include <boost/range.hpp>

int array[10];
boost::size(array); // returns 10
5 голосов
/ 24 ноября 2011

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

Вы должны быть в состоянии что-то вроде

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

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

1 голос
/ 16 марта 2018

C ++ 17 поддержка std::size() (определено в заголовке <iterator>)

#include <iterator>

int my_array[10];
std::size(my_array);

std::vector<int> my_vector(10);
std::size(my_vector);
1 голос
/ 24 ноября 2011

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

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

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

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

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

0 голосов
/ 24 ноября 2011

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

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


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

...