Я пытаюсь создать эквивалент макроса Visual Studio _countof, используя шаблоны C ++. Ниже приведены мои предлагаемые определения:
template<typename T, size_t N>
inline constexpr size_t countof(T const (&array)[N]) {
return N;
}
template<typename T, typename U, size_t N>
inline constexpr size_t countof(T const (U::&array)[N]) {
return N;
}
Второе объявление выше было попыткой исправить следующий код, который генерирует ошибку времени компиляции в g ++ 9 с сообщением: «error: недопустимое использование non-static элемент данных 'foo :: bar' ":
struct foo {
int const bar[4];
static_assert(countof(bar) == 4);
};
Однако, когда я добавляю второе определение и изменяю утверждение на использование foo::bar
, g ++ генерирует ошибку:« error: »templateconstexpr const size_t countof 'конфликтует с предыдущим объявлением ".
Я могу изменить код для использования указателя на член (вместо ссылки на член), но, похоже, в этом нет необходимости. Кто-нибудь знает способ создания версии countof
, которая компилируется только при передаче массива и разумно работает как для свободных, так и для массивов переменных-членов?