gpt4 book ai didi

c++ - 是否可以定义一个宏来定义枚举类和返回枚举元素计数的 GetCount() 方法?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:55 26 4
gpt4 key购买 nike

我能够定义宏来定义旧式枚举和返回枚举元素计数的 GetCount() 方法:

#define DEFINE_FLAGS_ENUM(EnumName, ...) \
struct EnumName { \
enum { __VA_ARGS__ }; \
static constexpr std::size_t GetCount() { return std::max({__VA_ARGS__}) + 1;} \
};

对于枚举类,我的第一个想法是:

template <class T> struct EnumTraits;

#define NDA_FLAGS_ENUM(EnumName, ...) \
enum class EnumName { __VA_ARGS__ }; \
template<> struct EnumTraits<EnumName> { static constexpr std::size_t GetCount() { return std::max({__VA_ARGS__}) + 1; }};

但这不会编译,因为 VA_ARGS 应该加上 'EnumName::'。

最佳答案

枚举

正如评论中所建议的,至于你的第一个宏 DEFINE_FLAGS_ENUM , std::max似乎不起作用。因此,我提出了一种替代方法。

由于我们的 enum在类 EnumName 中被定义为匿名的,我们可以定义它们的元组并在编译时检测它的大小,如下所示。所以这个宏很适合你:

#include <tuple>

#define DEFINE_FLAGS_ENUM(EnumName, ...) \
struct EnumName \
{ \
enum { __VA_ARGS__ }; \
\
static constexpr std::size_t GetCount() \
{ \
using T = decltype(std::make_tuple(__VA_ARGS__)); \
return std::tuple_size<T>::value; \
} \
};

枚举类

对于 enum class ,我们可以按如下方式重用上述方法。在这里,我们不再计算枚举类的元素,而是再次计算隐藏在类 EnumTraits<EnumName> 中的 enum 的元素。作为私有(private)成员(member):

#include <tuple>

template <class T> struct EnumTraits;

#define NDA_FLAGS_ENUM(EnumName, ...) \
enum class EnumName { __VA_ARGS__ }; \
template<> \
struct EnumTraits<EnumName> \
{ \
private: \
enum { __VA_ARGS__ }; \
\
public: \
static constexpr std::size_t GetCount() \
{ \
using T = decltype(std::make_tuple(__VA_ARGS__)); \
return std::tuple_size<T>::value; \
} \
};

然后我们可以定义一个枚举和枚举类如下:

DEMO

// enum.
DEFINE_FLAGS_ENUM(Animal, Dog, Cat)
static_assert(Animal::GetCount() == 2);

// enum class.
NDA_FLAGS_ENUM(Vehicle, Car, Train, AirPlain)
static_assert(EnumTraits<Vehicle>::GetCount() == 3);

关于c++ - 是否可以定义一个宏来定义枚举类和返回枚举元素计数的 GetCount() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54574856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com