Время компиляции sizeof_array без использования макроса

Это то, что беспокоило меня последние пару дней, я нене думаю, что этоможно решить, но яЯ видел шаблон магии раньше.

Вот оно:

Чтобы получить количество элементов в стандартном массиве C ++, я мог бы использовать или макрос (1), или безопасную встроенную функцию (2):

(1)

#define sizeof_array(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))

(2)

template 
size_t sizeof_array(const T& ARRAY){
    return (sizeof(ARRAY)/sizeof(ARRAY[0]));
}

Как вы можете видеть, первая проблема заключается в том, что она является макросом (на данный момент я считаю, что это проблема), а другая проблема заключается в невозможности получить размер массива во время компиляции; то есть я могут написать:

enum ENUM{N=sizeof_array(ARRAY)};

или же

BOOST_STATIC_ASSERT(sizeof_array(ARRAY)==10);// Assuming the size 10..

Кто-нибудь знает, можно ли это решить?

Обновить:

Этот вопрос был создан до появления constexpr. В настоящее время вы можете просто использовать:

template 
constexpr auto sizeof_array(const T& iarray) {
    return (sizeof(iarray) / sizeof(iarray[0]));
}

Ответы на вопрос(10)

Ваш ответ на вопрос