我正在尝试使用 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 版本的方法,该版本仅在传递数组时才编译,并且对自由和成员变量数组都以合理的方式工作?

最佳答案

问题是 barstatic_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/

10-09 03:27