[C ++成员数组的实现数量

问题描述 投票:1回答:1

我正在尝试使用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的非宏版本的方法,该方法可以合理地用于成员变量?

c++ g++ c++14
1个回答
0
投票

我可以更改代码以使用指向成员的指针(而不是对成员的引用,但是似乎应该没有必要。)>

您可以。例如

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);
};
© www.soinside.com 2019 - 2024. All rights reserved.