什么是< >在结构旁边吗?

时间:2016-11-17 10:21:00

标签: c++

好的,以下代码是从另一个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 **?感谢。

1 个答案:

答案 0 :(得分:8)

这是指针类型的特化。专业化也可能有模板参数。因此,在一般情况下,此模板的type仅为T,但如果T是指针类型,那么其typeT指针已删除。在给参数赋予不同名称时可能会更清楚:

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而没有指针。