Это что-то, что беспокоило меня последние пару дней, я не думаю, что это можно решить, но раньше я видел шаблонную магию.
Здесь:
Чтобы получить количество элементов в стандартном массиве С++, я мог бы использовать либо макрос (1), либо встроенную функцию typeafe (2):
(1)
#define sizeof_array(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))
(2)
template <typename T>
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 <typename T>
constexpr auto sizeof_array(const T& iarray) {
return (sizeof(iarray) / sizeof(iarray[0]));
}