类方法上的C ++ typetraits:如果参数是枚举,则部分特化

时间:2013-09-18 18:53:53

标签: c++ templates enums typetraits

我的平台是使用Visual Studio Express 2012的Windows。

我有一个模板化的方法如下

struct A 
{
    template<class T> void blub(T value);
};

我希望有以下几种特色:

template<> void A::blub(std::string value) { /* ... */ }
template<> void A::blub(int value) { /* ... */ }

但是,现在我想要包含枚举,不管怎么说:

enum MyEnum { ENUM_1 };

A a;
a.blub(ENUM_1);

这当然失败了,因为那种类型没有专业化。我不知道 事先确切的枚举,所以我想为枚举推导一个模板专门化。

执行以下操作将无法编译:

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

编译器失败并显示C2244。这是有道理的,因为编译器通常不能推断出该方法的类型。

这让我得出结论:我想要的是不可能的。对于上述电话,我必须做以下事项:

A a;
a.blub((int)ENUM_1);

我的结论是对的吗?我只需要在电话中进行演员表演?一个解决方法是模拟课程,但我不想这样做,因为除了那个方法之外,该课程确实做了很多其他事情。

1 个答案:

答案 0 :(得分:3)

您的尝试尝试部分专门化功能模板 - 这是不允许的。在返回类型上执行此操作:

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

Live example.