C++ C++;类方法上的typetraits:如果参数为enum,则部分专门化

C++ C++;类方法上的typetraits:如果参数为enum,则部分专门化,c++,templates,enums,typetraits,C++,Templates,Enums,Typetraits,我的平台是Windows和Visual Studio Express 2012 我有一个模板化方法,如下所示 struct A { template<class T> void blub(T value); }; 当然,这是失败的,因为这种类型没有专门化。我不知道是什么原因 我想提前得到一个精确的枚举,所以我通常要为枚举派生一个模板专门化 执行以下操作会导致编译失败: template<class T> void A::blub(const typename

我的平台是Windows和Visual Studio Express 2012

我有一个模板化方法,如下所示

struct A 
{
    template<class T> void blub(T value);
};
当然,这是失败的,因为这种类型没有专门化。我不知道是什么原因 我想提前得到一个精确的枚举,所以我通常要为枚举派生一个模板专门化

执行以下操作会导致编译失败:

template<class T> void A::blub(const typename std::enable_if<std::is_enum<T>::value, T>::type& value) { /* ... */ }

我的结论正确吗?我只是要在电话里演演员?一种解决方法是对类进行模板化,但我不想这样做,因为除了该方法之外,该类还做了很多其他事情。

您试图对函数模板进行局部专门化,这是不允许的。改为在返回类型上执行以下操作:

struct A
{
    template<typename T>
    typename std::enable_if<std::is_enum<T>::value>::type
    blub(T value);

    // and don't specialize for concrete types,
    // just overload:

    void blub(std::string value);
    void blub(int value);
};
结构A { 模板 typename std::enable_if::type blub(T值); //不要专门研究混凝土类型, //只是过载: void blub(标准::字符串值); 无效blub(int值); };

template<class T> void A::blub(const typename std::enable_if<std::is_enum<T>::value, T>::type& value) { /* ... */ }
A a;
a.blub((int)ENUM_1);
struct A
{
    template<typename T>
    typename std::enable_if<std::is_enum<T>::value>::type
    blub(T value);

    // and don't specialize for concrete types,
    // just overload:

    void blub(std::string value);
    void blub(int value);
};