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

У меня есть класс шаблона с параметром 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, я отказался от обходного пути, предложенного Навазом, и специализировал весь класс, поскольку в любом случае он имел только одну функцию-член и один элемент данных.


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