Как уже было сказано, код фактически определяет количество элементов в массиве, а не struct. Я бы просто выписал деление sizeof () явно, когда захочу. Если бы я сделал это функцией, я бы хотел в своем определении дать понять, что он ожидает массив.
template<typename T,int SIZE>
inline size_t array_size(const T (&array)[SIZE])
{
return SIZE;
}
Вышеуказанное похоже на в xtofl, за исключением того, что оно защищает от передачи указателя на него (который указывает на динамически размещенный массив) и получения неправильного ответа по ошибке.
РЕДАКТИРОВАТЬ : Упрощено согласно JohnMcG .
РЕДАКТИРОВАТЬ : встроенный.
К сожалению, вышеприведенное не дает ответа во время компиляции (даже если компилятор встроен и оптимизирует его как постоянную под капотом), поэтому его нельзя использовать как выражение константы времени компиляции. Т.е. он не может быть использован как размер для объявления статического массива. В C ++ 0x эта проблема исчезнет, если заменить ключевое слово inline на constexpr (constexpr встроен неявно).
constexpr size_t array_size(const T (&array)[SIZE])
Решение jwfearn работает во время компиляции, но включает в себя определение типа, которое эффективно «сохраняло» размер массива при объявлении нового имени. Размер массива затем определяется путем инициализации константы через это новое имя. В таком случае можно также просто сохранить размер массива в константу с начала.
Опубликованное решение Мартина Йорка также работает во время компиляции, но включает использование нестандартного оператора typeof () . Чтобы обойти это, либо дождитесь C ++ 0x и используйте decltype (к тому времени он фактически не понадобится для этой проблемы, поскольку у нас будет constexpr ). Другой альтернативой является использование Boost.Typeof, в этом случае мы получим
#include <boost/typeof/typeof.hpp>
template<typename T>
struct ArraySize
{
private: static T x;
public: enum { size = sizeof(T)/sizeof(*x)};
};
template<typename T>
struct ArraySize<T*> {};
и используется при написании
ArraySize<BOOST_TYPEOF(foo)>::size
, где foo - имя массива.