从枚举类值模板参数推断枚举类类型

Infer enum class type from enum class value template parameter?

本文关键字:枚举 类型 参数      更新时间:2023-10-16

是否可以创建一个模板,以渗透枚举类别的基础类类型 value> value 模板参数?我希望做类似以下非工作伪示例的事情:

enum class MyEnumClass { e1, e2, e3 };
template<enum class T X> MyTemplate { // wrong syntax. want to specify X, infer T
     using enum_class_type = T;
     static constexpr enum_class_type value = X;
};

我只想使用一个参数,例如MyTemplate<MyEnumClass::e1>

static_assert( std::is_same<MyTemplate<MyEnumClass::e1>::enum_class_type, MyEnumClass>::value );
static_assert( MyTemplate<MyEnumClass::e2>::value == MyEnumClass::e2 );

我知道以下有效,但是它要求我明确将枚举类类型指定为第二个模板参数:

template<typename EnumClass, EnumClass X>
struct EnumValue {
    using enum_class_type = EnumClass;
    static constexpr enum_class_type value = X;
};
// usage: EnumValue<MyEnumClass, MyEnumClass::e1>::enum_class_type

这是直到C 17直接可以做

的直接可能直接的。
template <auto x>
class MyTemplate {
    using enum_type= decltype(x);
    static constexpr enum_type value = x;
};

您的用例被认为是新功能的确切原因。请参阅此处