Это не самый хороший способ сделать это, но так как вы спрашиваете: тип возвращаемого значения функции шаблона ArraySizeHelper
равен char[N]
, где аргумент функции - это массив (ссылка на)размером N типа T
.Вывод аргумента шаблона создает экземпляр этого шаблона с совпадающим числом N, и поэтому sizeof(char[N])
- это просто N, и это то, что вы получаете.
Более приятная версия может быть написана следующим образом.(Вам нужно C ++ 0x для constexpr
; если вы его опустите, это не будет константным выражением.)
template <typename T, size_t N> constexpr size_t array_size(const T (&)[N]) { return N; }
Использование:
int x[20];
array_size(x); // == 20
Обновление: Если вы находитесь в C ++ 0x, вот еще одно решение, которое дает constexpr, благодаря decltype:
#include <type_traits>
template <typename T> struct array_traits;
template <typename T, unsigned int N> struct array_traits<T[N]>
{
static const unsigned int size = N;
typedef std::decay<T>::type type;
};
// Usage:
int x[20];
array_traits<decltype(x)>::size; // == 20