【发布时间】:2020-06-15 10:11:04
【问题描述】:
我有一个事件处理程序类,它使用模板参数来设置事件类型。我想将这些事件类型强制为一个字节大小的 枚举类。针对大小的静态断言不是问题,但我无法在网上找到有关如何静态区分 enum 和 enum 类 的信息。
我现在的解决方案是使用C++ front-end implements syntactic extensions 为枚举断言,然后断言正确的大小。在大多数平台上这是可行的,因为枚举使用 int 类型(通常大于一个字节)。
但这会导致稍微误导性的错误消息。我喜欢彻底。
我可以做哪些检查才能通过类枚举,但会因常规旧枚举而失败?
我不能使用type_traits,因为我使用的编译器 (avr-gcc) 不支持它。然而,当需要时,我会不断地实施我自己的type_traits。所以type_traits 中有关解决方案的任何提示仍然有用!
简单示例:
// Event types
enum class tPass : uint8_t {};
enum class tFailSize : uint16_t {}; // Fail on size!
enum tFailType {}; // Currently fails on size, would like to fail on type!
// Event handler
template <typename TEvent>
class tEventHandler
{
static_assert(__is_enum(TEvent), "Must be class enum!"); // Doesn't really check for CLASS enums
static_assert(1 == sizeof(TEvent), "Must be one byte!");
};
用法:
auto handler = tEventHandler<tPass>(); // Ok!
// auto handler2 = tEventHandler<tFailSize>(); // error: static assertion failed: Must be one byte!
// auto handler3 = tEventHandler<tFailType>(); // error: static assertion failed: Must be one byte! <----- THIS
目标:
auto handler = tEventHandler<tPass>(); // Ok!
// auto handler2 = tEventHandler<tFailSize>(); // error: static assertion failed: Must be one byte!
// auto handler3 = tEventHandler<tFailType>(); // error: static assertion failed: Must be class enum! <--- THIS
【问题讨论】:
标签: c++ enums enumeration static-assert enum-class