Как да специализирам член на шаблонен клас с параметър на шаблон на шаблон

Имам клас на шаблон с 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, и специализирах целия клас, тъй като така или иначе имаше само една членска функция и един член с данни.


person Gabriel Schreiber    schedule 26.09.2011    source източник


Отговори (4)


Не можете частично да специализирате отделна членска функция, ще трябва да го направите за целия клас.

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() {}
};
person Praetorian    schedule 26.09.2011

Тъй като това не е позволено, ето едно решение:

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>. В противен случай ще бъде разрешена първата, общата функция.

person Nawaz    schedule 26.09.2011

В C++ нямате право частично да специализирате функция; можете само частично да специализирате класове и структури. Вярвам, че това се отнася и за функциите на членовете.

person fbrereto    schedule 26.09.2011

Вижте тази статия: http://www.gotw.ca/publications/mill17.htm

Той е доста малък и има добри примери за код. Той ще обясни проблема със специализацията на функцията на пространствения шаблон и ще покаже други начини за заобикалянето му.

person John Humphreys    schedule 26.09.2011