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

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

lxlovekobe8 回答:成员数组的C ++实现数量

问题是barstatic_assert(countof(bar) == 4);中的使用无效,您需要一个foo的实例并获取成员数组bar才能传递给{{1} }。

  

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

您可以更改代码以使用成员指针。例如

countof

然后

template<typename T,typename U,size_t N>
inline constexpr size_t countof(T const (U::*array)[N]) {
    return N;
}

LIVE

或更改static_assert(countof(&foo::bar) == 4); 以指定类型,而不是将数组传递给它。

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;
}

LIVE

,

我想不出没有宏就可以做到这一点的方法,但是this post提供了一种同时获取类型安全性的方法(确保传递给countof的参数是一个数组)并且支持free和member数组。结果代码为:

template<typename T,size_t N>
char (&COUNTOF_REQUIRES_ARRAY_ARGUMENT(T (&array)[N]))[N];

#define countof(x) sizeof(COUNTOF_REQUIRES_ARRAY_ARGUMENT(x))
本文链接:https://www.f2er.com/3155309.html

大家都在问