gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:38:33 25 4
gpt4 key购买 nike

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

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

关于c++ - 我可以使用类型特征从 C++ 中的枚举值推断出枚举的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37662442/

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