Время компиляции 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]));
}