2016-12-04 4 views
0

基礎となる列挙型クラスのenumクラスのテンプレートパラメータを推測するテンプレートを作成できますか?私は、次の非稼働擬似例のような何かを探しています:私は唯一つのパラメータを持つインスタンス化になりたい列挙型クラスの型を列挙型クラスのテンプレートパラメータから推測しますか?

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

私は、次の作品ということを知っているが、それは明示的に2番目のテンプレートパラメータとして列挙型クラスの型を指定するために私を必要とします。

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 

答えて

2

これは、cまで直接ことはできません++あなたが行うことができる17、

template <auto x> 
class MyTemplate { 
    using enum_type= decltype(x); 
    static constexpr enum_type value = x; 
}; 

あなたのユースケースは、新しい機能の正確な理由として引用されています。 here