среда, 21 августа 2013 г.

array size

array size
/** Как определить длину массива в C++? */

/** Определять длину массива как sizeof(arr)/sizeof(*arr) не совсем
    безопасно, так как arr может быть обычным указателем.  В Google
    Chrome используется для этого такой макрос: */ 

template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define ARRAY_SIZE(array) (sizeof(ArraySizeHelper(array)))

/** Компилятор ругнётся, если попытаться подставить обычный
    указатель. Для простоты и лёгкости понимания определения функции
    ArraySizeHelper, возвращающей ссылку на массив char[N] можно
    переписать так: */

#include <boost/type_traits/add_reference.hpp>

template <typename T, size_t N>
typename boost::add_reference<char[N]>::type ArraySizeHelper( T (&)[N] ) ;
#define ARRAY_SIZE(array) (sizeof(ArraySizeHelper(array)))

/** Почитать подробнее:
    http://easy-coding.blogspot.com/2011/05/blog-post_24.html
    http://stackoverflow.com/questions/6376000/how-does-this-array-size-template-work */

Комментариев нет:

Отправить комментарий