如何为底层类型int的枚举专门化一个类?

RaB*_*RaB 8 c++ c++11

#include <type_traits>

enum class MyEnum
{
    Hello
};

template <typename T, typename Enable = void>
class MyClass
{
public:
    MyClass(T obj) : e(obj)
    {}

private:
    T e;
};

template <typename T>
class MyClass <T, 
    typename std::enable_if< std::is_enum<T>::value 
                             && std::is_same<typename std::underlying_type<T>::type, 
                                             int>::value>::type > 
{
public:
    MyClass(T obj) : e(obj)
    {}

private:
    T e;
};

int main()
{
    MyClass<MyEnum> c(MyEnum::Hello);
    MyClass<int> c1(1); //does not compile due to std::underlying_type
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够将MyClass专门用于底层类型'int'的枚举.我不能使用std :: underlying_type这样做,因为它只针对枚举.关于如何进行的任何想法?

Que*_*tin 10

这个怪癖的一个简单的解决方案是隔离std::underlying_type你自己的SFINAE友好特征:

template <class T, class = void>
struct underlying_type {};

template <class T>
struct underlying_type<
    T,
    typename std::enable_if<std::is_enum<T>::value>::type
> {
    using type = typename std::underlying_type<T>::type;
};
Run Code Online (Sandbox Code Playgroud)

那么你的专业化可以写成:

template <typename T>
class MyClass<
    T, 
    typename std::enable_if<std::is_same<
        typename underlying_type<T>::type,
        int
    >::value>::type
> {
    // ...
};
Run Code Online (Sandbox Code Playgroud)