我正在尝试使用C ++模板创建等效于Visual Studio _countof宏。以下是我提出的定义:
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中生成编译时错误,并显示以下消息:“错误:无效使用非静态数据成员'foo :: bar'”“:
struct foo {
int const bar[4];
static_assert(countof(bar) == 4);
};
但是,当我添加第二个定义并更改断言以使用foo::bar
时,g ++会生成错误:“错误:‘template constexpr const size_t countof’与先前的声明冲突”。
我可以更改代码以使用指向成员的指针(而不是对成员的引用),但是似乎应该没有必要。有谁知道一种制作countof
版本的方法,该版本仅在传递数组时才编译,并且对于自由变量数组和成员变量数组都以合理的方式工作?