Могу ли я специализировать шаблон класса с помощью шаблона псевдонима? - PullRequest
12 голосов
/ 18 октября 2011

Вот простой пример:

class bar {};

template <typename>
class foo {};

template <>
using foo<int> = bar;

Это разрешено?

Ответы [ 3 ]

11 голосов
/ 18 октября 2011
$ clang++ -std=c++0x test.cpp
test.cpp:6:1: error: explicit specialization of alias templates is not permitted
template <>
^~~~~~~~~~~
1 error generated.

Ссылка: 14,1 [temp.decls] / p3:

3 Поскольку объявление псевдонима не может объявить идентификатор шаблона, оно не является можно частично или явно специализировать шаблон псевдонимов.

11 голосов
/ 19 марта 2012

Хотя прямая специализация псевдонима невозможна, здесь есть обходной путь. (Я знаю, что это старый пост, но он полезен.)

Вы можете создать структуру шаблона с членом typedef и специализировать структуру. Затем вы можете создать псевдоним, который ссылается на члена typedef.

template <typename T>
struct foobase {};

template <typename T>
struct footype
  { typedef foobase<T> type; };

struct bar {};

template <>
struct footype<int>
  { typedef bar type; };

template <typename T>
using foo = typename footype<T>::type;

foo<int> x; // x is a bar.

Это позволяет вам косвенно специализировать foo, специализируя footype.

Вы можете даже привести его в порядок, унаследовав от удаленного класса, который автоматически предоставляет typedef. Тем не менее, некоторые могут найти это больше хлопот. Лично мне это нравится.

template <typename T>
struct remote
  { typedef T type; };

template <>
struct footype<float> :
  remote<bar> {};

foo<float> y; // y is a bar.
7 голосов
/ 18 октября 2011

В соответствии с §14.7.3 / 1 стандарта (также упоминаемого в этом другом ответе ), псевдонимы не допускаются в качестве явных специализаций: (* ​​1003 *

явноеспециализация любого из следующего:

  • шаблон функции
  • шаблон класса
  • функция-член шаблона класса
  • статический член данных классаtemplate
  • класс члена шаблона класса
  • шаблон класса члена класса или шаблона класса
  • шаблон функции-члена класса или шаблона класса

может быть объявлено [...]

...