Хотя прямая специализация псевдонима невозможна, здесь есть обходной путь.
(Я знаю, что это старый пост, но он полезен.)
Вы можете создать структуру шаблона с членом 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.