частичная специализация шаблона - PullRequest
7 голосов
/ 18 августа 2011

У меня есть сценарий, в котором есть шаблон класса

template<typename X, typename Y>
class Foo
{
 typedef Y::NestedType Bar;

 int A (Bar thing);
 void B();
 int C(X that);

 // other stuff
};

и затем я бы хотел, чтобы метод A () имел другое поведение, когда X является данным типом (но B и C могут оставаться прежними, а в реальном коде фактически есть около 10 других методов, некоторые из которых довольно длительный и подверженный частым изменениям .. поэтому я бы предпочел не делать специализацию для полного класса, а копировать и вставлять полную реализацию класса)

Я продолжил и написал:

template<typename T>
int Foo<MyType, T>::A(Bar thing);

но мой компилятор (clang 163.7.1) отказался даже рассматривать это как шаблонную специализацию любого рода.

Есть ли какая-то синтаксическая ошибка, скрытая в том, как я написал код, или этот стиль кодирования недопустим в C ++? К сожалению, даже если другие компиляторы поддерживают эту идиому, моя компания застряла с clang.

Спасибо за любую помощь в этом.

1 Ответ

7 голосов
/ 18 августа 2011

Использовать перегрузку

template<typename X, typename Y>
class Foo
{
 // allows to wrap up the arguments
 template<typename, typename>
 struct Types { };

 typedef Y::NestedType Bar;

 int A (Bar thing) {
   return AImpl(thing, Types<X, Y>());
 }

 void B();
 int C(X that);

 // other stuff
private:
  template<typename X1, typename Y1>
  int AImpl(Bar thing, Types<X1, Y1>) {
    /* generic */
  }

  template<typename Y1>
  int AImpl(Bar thing, Types<SpecificType, Y1>) {
    /* special */
  }
};

Вы не можете частично специализировать член шаблона класса. То, что вы написали, будет определением функции-члена A частичной специализации самого шаблона класса.

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