R. *_*des 12 c++ template-specialization c++11 template-aliases
这是一个简单的例子:
class bar {};
template <typename>
class foo {};
template <>
using foo<int> = bar;
Run Code Online (Sandbox Code Playgroud)
这是允许的吗?
How*_*ant 11
$ clang++ -std=c++0x test.cpp
test.cpp:6:1: error: explicit specialization of alias templates is not permitted
template <>
^~~~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
参考:14.1 [temp.decls]/p3:
3由于别名声明无法声明模板ID,因此无法部分或显式地专门化别名模板.
小智 11
虽然别名的直接专业化是不可能的,但这是一种解决方法.(我知道这是一个老帖子,但它很有用.)
您可以使用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.
Run Code Online (Sandbox Code Playgroud)
这使您可以foo通过专业化间接专业化footype.
您甚至可以通过继承自动提供typedef的远程类来进一步整理它.但是,有些人可能会发现这更麻烦.就个人而言,我喜欢它.
template <typename T>
struct remote
{ typedef T type; };
template <>
struct footype<float> :
remote<bar> {};
foo<float> y; // y is a bar.
Run Code Online (Sandbox Code Playgroud)