我该如何为所有枚举类型局部特化一个类模板?

7

假设我有一些类模板:

template<typename T>
class {
// ....
}

我可以通过以下方法部分地为所有指针专门定制此模板:

template<typename T>
class<T *> {
// ....
}

我能否为所有枚举类型专门定制模板?例如,像这样做: (尽管这样做是不起作用的)

template<typename T>
class<enum T> {
// ....
}
1个回答

20

使用C++11和SFINAE。

#include <type_traits>

template<typename T, typename = void>
struct Specialize
{
};

template<typename T>
struct Specialize<T, typename std::enable_if<std::is_enum<T>::value>::type>
{
   void convert() { }
};

enum E
{
};

int main()
{
   Specialize<E> spec;
   spec.convert();
}

没有使用C++11时,可以使用boost::enable_ifboost::is_enum

1
这个方案对于类很有效,但我在使用函数模板时遇到了问题,例如:template <typename U, typename = void> U f(int i);template<typename U, typename std::enable_if<std::is_enum<U>::value, U>::type> U f(int i){ ...;}枚举 myenum {A,B,C,D};main () { myenum xx; xx = f<myenum>(1); // [1] xx = f<myenum,myenum>(2); // [2]}使用gcc 4.7.2并使用-std=c++11,[1]导致未定义的引用'myenum f<myenum,void>(int)',而[2]导致未定义的引用'myenum f<myenum,myenum>(int)'。有什么想法吗? - qwer1304
liveworkspace.org这个东西已经消失了。过载看起来是什么样子? - B3ret
@B3ret 我也是这样..链接无效,这就是为什么在stackoverflow中复制代码也很重要。你找到如何对函数进行操作了吗? - Paolo Vigori
如果我将相同的“convert”函数添加到通用类“Specialize”中,程序仍然可以编译通过。我原本期望会出现“模糊错误”,因为通用版本和专用版本都匹配初始化“Specialize <E> spec”。请问有人能解释一下这种行为吗? - Kelvin Hu
抱歉,我最终注意到std::enable_if没有第二个参数,所以对于枚举类型,它应该是Specialize<E, void>,而不是我之前认为的Specialize<E, E>,这是通用版本的特化。对于非枚举类型,这种特化不存在。 - Kelvin Hu
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接