好的,以下代码是从另一个stackoverflow问题中复制的 here
template<typename T>
struct remove_pointer
{
typedef T type;
};
template<typename T>
struct remove_pointer<T*>
{
typedef typename remove_pointer<T>::type type;
};
虽然我明白这是模板中的递归定义,但令我困惑的是行
template<typename T>
struct remove_pointer<T*>
是否意味着 remove_pointer 会导致 T = int * ?为什么T = int **?感谢。
答案 0 :(得分:8)
这是指针类型的特化。专业化也可能有模板参数。因此,在一般情况下,此模板的type
仅为T
,但如果T
是指针类型,那么其type
为T
指针已删除。在给参数赋予不同名称时可能会更清楚:
template<typename T>
struct remove_pointer
{
typedef T type;
};
template<typename S>
struct remove_pointer<S*> // specialization for T = S*
{
typedef typename remove_pointer<S>::type type;
};
即。在一般情况下,type
仅为T
,但如果T
是指针,则会为S
实例化模板,其中T == S*
。
PS:我认为这个例子的特殊之处在于专业化引入了一个新的模板参数。 A&#34;正常&#34;专业化看起来像这样:
template<>
struct remove_pointer<int*> // specialization for T = int*
{
typedef typename remove_pointer<int>::type type;
};
然而,这并不是非常有用,因为我们希望它适用于任何类型。解决方案是在特化(S
)上引入额外的模板参数。 Afaik这个附加参数必须可以从原始模板的参数中推导出来,在这种情况下可以推导出S
,因为S
只是T
而没有指针。