如何使用模板模板参数专门化模板类的成员

时间:2011-09-26 17:33:48

标签: c++ templates template-specialization

我有一个带有int和模板模板参数的模板类。 现在我想专门化一个成员函数:

template <int I> class Default{};
template <int N = 0, template<int> class T = Default> struct Class
{
    void member();
};

// member definition
template <int N, template<int> class T> inline void Class<N, T>::member() {}

// partial specialisation, yields compiler error
template <template<int> class T> inline void Class<1, T>::member() {}

有人可以告诉我这是否可能以及我在最后一行做错了什么?

编辑:我要感谢大家的意见。由于我还需要对某些T进行专门化,因此我选择了Nawaz建议的解决方法,专门针对整个类,因为它只有一个成员函数和一个数据成员。

4 个答案:

答案 0 :(得分:6)

你不能部分专门化一个成员函数,你必须为整个类做。

template <int I> class Default{};
template <int N = 0, template<int> class T = Default> struct Class
{
    void member();
};

// member definition
template <int N, template<int> class T> inline void Class<N, T>::member() {}

// partial specialization
template <template<int> class T> struct Class<1, T>
{
  void member() {}
};

答案 1 :(得分:3)

由于这是不允许的,这里有一个解决方法:

template <int I> class Default{};

template <int N = 0, template<int> class T = Default> 
struct Class
{
    void member()
    {
         worker(int2type<N>()); //forward the call
    }
 private:
     template<int N> struct int2type {};

     template<int M>
     void worker(const int2type<M>&) //function template
     {
         //general for all N, where N != 1
     }
     void worker(const int2type<1>&) //overload 
     {
         //specialization for N == 1
     }
};

这个想法是,当N = 1时,函数调用worker(int2type<N>())将解析为第二个函数(特化),因为我们传递的是int2type<1>类型的实例。否则,将解决第一个,一般的功能。

答案 2 :(得分:2)

在C ++中,不允许对函数进行部分特化;你只能部分地专门化类和结构。我相信这也适用于会员职能。

答案 3 :(得分:2)

查看此文章:http://www.gotw.ca/publications/mill17.htm

它非常小,并且有很好的代码示例。它将解释patial模板函数专业化的问题,并展示其他方法。