специализация шаблона для всего набора параметров - PullRequest
2 голосов
/ 17 апреля 2011

Возможно, это легко решить, но трудно найти решение этой проблемы:

Можно ли (частично) специализироваться для целого набора типов? В примере «Foo» должен быть частично специализирован для (T, int) и (T, double) только с одним определением шаблона.

Что я могу сделать, так это определить специализацию для (T, int). Увидеть ниже. Но это должно быть для (T, int) и (T, double) только с одним определением функции (без удвоения кода).

template <typename T,typename T2>
struct Foo
{
  static inline void apply(T a, T2 b) 
  {
    cout << "we are in the generic template definition" << endl;
  }
};

// partial (T,*)
template <typename T>
struct Foo<T, int >     // here something needed like T2=(int, double)
{
  static inline void apply(T a, T2 b) 
  {
    cout << "we are in the partial specialisation for (T,int)" << endl;
  }
};

Есть идеи, как частично специализировать это для (T, int) и (T, double) с одним определением шаблона?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

Я полагаю, что вы можете сделать это, используя Boost's enable_if , чтобы включить частичную специализацию только для тех типов, которые вам нужны. Раздел 3.1 показывает, как и приводит этот пример:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
0 голосов
/ 17 апреля 2011

Если я правильно понял ваш вопрос, то вы можете написать шаблон базового класса и извлечь его из него, как показано ниже:

template <typename T, typename U>
struct Foo_Base
{
  static inline void apply(T a) 
  {
    cout << "we are in the partial specialisation Foo_Base(T)" << endl;
  }
};

template <typename T>
struct Foo<T, int> : Foo_Base<T, int> {};

template <typename T>
struct Foo<T, double> : Foo_Base<T, double> {};

Хотя это не одно определение шаблона (как вы просили), но вы можете избежать дублирования кода.

Демо: http://www.ideone.com/s4anA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...