我可以使用类型特征从 c++ 中的枚举值推断枚举的类型吗?

Can I use type traits to deduce the type of an enum from an enum value in c++?

本文关键字:枚举 类型 可以使 特征 c++ 我可以      更新时间:2023-10-16

在下面的示例中,我创建了一些基于枚举值模板化的流畅方法,用于测试值是否包含特定标志。

#include <type_traits>
// Scoped flags enum
enum class Flags {
    One = 1 << 0,
    Two = 1 << 1
};
// Template method for enum bitwise and operator
template< typename enum_type >
constexpr enum_type bitwise_and_operator(enum_type lhs, enum_type rhs) {
    typedef typename std::underlying_type<enum_type>::type fundamental_type;
    return static_cast<enum_type>(static_cast<fundamental_type>(lhs) & static_cast<fundamental_type>(rhs));
}
// Flags and operator
constexpr Flags operator&(Flags lhs, Flags rhs) {
    return bitwise_and_operator<Flags>(lhs, rhs);
}
// Template method for enum flag
template< typename enum_type, enum_type enum_value >
constexpr bool Flagged(enum_type type) {
    return (type & enum_value) == enum_value;
}
// Has flag one?
constexpr bool HasOne(Flags flags) {
    return Flagged<Flags, Flags::One>(flags);
};
// Has flag two?
constexpr bool HasTwo(Flags flags) {
    return Flagged<Flags, Flags::Two>(flags);
};

int main() {
    auto flag = Flags::One;
    auto True = HasOne(flag);
    auto False = HasTwo(flag);
    return 0;
}

包括两个模板参数 Flags 和 Flags::One,可能比编译器所需的信息更多。

是否可以构建一个可以调用为:

constexpr bool HasOne(Flags flags) {
    return Flagged<Flags::One>(flags);
};

我将如何构造一个在编译时从值推断枚举类型的方法? 还是有另一个编译时解决方案可以解决这个问题?

提前谢谢。

您希望

enum_value作为模板参数的原因是什么?您可以简单地将其作为另一个参数传递:

template <typename enum_type>
constexpr bool Flagged(enum_type src, enum_type flag) {
    return (src & flag) == flag;
}
// Has flag one?
constexpr bool HasOne(Flags flags) {
    return Flagged(flags, Flags::One);
};

截至目前,仅使用宏:

 #define FLAGGED(x,y) Flagged<decltype(x),x>(y)
有一个

提案正在制定中来解决这个问题。