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

Скажите, у меня есть это:

template<typename T, int X>
class foo 
{
public:
  void set(const T &t);
};

template<typename T, int X>
void foo::set<T, X>(const T &t)
{
  int s = X;
  // ...etc
}

Могу ли я специализировать тип функции 'T', но оставить 'X' в качестве параметра шаблона?

class bar;

template<int X>
void foo::set<bar, X>(const bar &t)
{
  int s = X;
  // ...etc
}

Возможно ли это?

Ответы [ 4 ]

6 голосов
/ 04 октября 2011

Это удивительно легко, когда вы освоите его

template<typename T, int X>
class foo 
{
private:
  template<typename, int> class params { };

public:
  void set(const T &t) {
    set(t, params<T, X>());
  }

private:
  template<typename T1, int X1>
  void set(const T1 &t, params<T1, X1>) {
     // ...
  }

  template<int X1>
  void set(const bar &t, params<bar, X1>) {
    // ...
  }
};

Это необходимо, потому что, если вы явно специализируете один элемент, вы должны предоставить все аргументы шаблона.Вы не можете оставить немного.

3 голосов
/ 04 октября 2011

Вы можете переписать свой код, чтобы сделать функцию-член отдельным шаблоном:

template <int X> class foo
{
  template <typename T> void set(const T &);
  // ...
};

Затем вы можете указать явные специализации для шаблона foo<X>::set.

2 голосов
/ 04 октября 2011

Нет.Это не разрешено.class функция-член должна быть полностью специализированной .Например, должно быть,

template<>
void foo<bar, 5>::set(const bar &t)
{          //^^^^
  int s = 5;
  // ...etc
}
1 голос
/ 04 октября 2011

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

...