我的平台是带有 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);
我的结论对吗?我只需要在通话中进行演员表吗?一种解决方法是将类模板化,但我不想这样做,因为除了该方法之外,该类确实做了很多其他事情。