2016-11-17 68 views
4

好下面的代码是从另一个计算器问题 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 **?解释赞赏。

回答

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:我认为这个例子的特别之处在于专业化引入了一个新的模板参数。 “正常”的专业化分工是这样的:

template<> 
struct remove_pointer<int*> // specialization for T = int* 
{ 
    typedef typename remove_pointer<int>::type type; 
}; 

但是,这心不是非常有用的,因为我们希望它为任何类型的工作。解决方案是在专业化(S)上引入额外的模板参数。 Afaik这个附加参数必须从参数到原始模板中推导出来,在这种情况下,可以推导出S,因为S只是没有指针的T

+0

感谢您的解释。但在此之前我接受的答案,我只是想确保我其实明白你说什么就有什么,remove_pointer 将调用函数在顶部,而remove_pointer 会在右下角调用该函数?而指针专门化必须与模板一起使用?或者它一般的作品?有没有网上提到这个? – Mox

+0

是的,你是对的。 [这里](https://www.youtube.com/watch?v=vwrXHznaYLA)是一个视频,详细解释了模板的类型推演。他在某些时候还提到专业化引入额外的模板参数的情况。我也会编辑答案,试图让它更清楚一点 – user463035818

相关问题