我的平台是使用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);
我的结论是对的吗?我只需要在电话中进行演员表演?一个解决方法是模拟课程,但我不想这样做,因为除了那个方法之外,该课程确实做了很多其他事情。
答案 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);
};