我正在尝试使用 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++ 会生成错误:“错误:‘模板 constexpr const size_t countof’与先前的声明冲突”。我可以更改代码以使用指向成员的指针(而不是对成员的引用),但这似乎是不必要的。有没有人知道一种制作
countof
版本的方法,该版本仅在传递数组时才编译,并且对自由和成员变量数组都以合理的方式工作? 最佳答案
问题是 bar
在 static_assert(countof(bar) == 4);
中的使用是无效的,你需要一个 foo
的实例并获取成员数组 bar
传递给 countof
。
您可以更改代码以使用指向成员的指针。例如
template<typename T, typename U, size_t N>
inline constexpr size_t countof(T const (U::*array)[N]) {
return N;
}
然后
static_assert(countof(&foo::bar) == 4);
LIVE
或者更改
countof
以指定类型而不是将数组传递给它。template<typename T>
struct count_of{};
template<typename T, size_t N>
struct count_of<T const [N]> {
constexpr static size_t value = N;
};
template<typename T>
inline constexpr size_t countof() {
return count_of<T>::value;
}
然后
static_assert(countof<decltype(foo::bar)>() == 4);
LIVE
关于成员数组的 C++ countof 实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58722241/