Как специализировать член класса шаблона с параметром шаблона шаблона - PullRequest
6 голосов
/ 26 сентября 2011

У меня есть шаблон класса с 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 ]

6 голосов
/ 26 сентября 2011

Вы не можете частично специализировать отдельную функцию-член, вам придется делать это для всего класса.

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() {}
};
3 голосов
/ 26 сентября 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>.В противном случае первая, общая функция будет разрешена.

2 голосов
/ 26 сентября 2011

Проверьте эту статью: http://www.gotw.ca/publications/mill17.htm

Он довольно маленький и имеет хорошие примеры кода. Это объяснит проблему со специализацией функций шаблонов и покажет другие пути ее решения.

2 голосов
/ 26 сентября 2011

В C ++ вам не разрешено частично специализировать функцию; Вы можете только частично специализировать классы и структуры. Я считаю, что это относится и к функциям-членам.

...