我正在尝试使用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
的非宏版本的方法,该方法可以合理地用于成员变量?
我可以更改代码以使用指向成员的指针(而不是对成员的引用,但是似乎应该没有必要。)>
您可以。例如
template<typename T, typename U, size_t N> inline constexpr size_t countof(T const (U::*array)[N]) { return N; }
和
struct foo {
int const bar[4];
static_assert(countof(&foo::bar) == 4);
};