"< >"旁边的结构体是什么意思?

4

好的,以下代码是从另一个stackoverflow问题中复制的 这里

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个回答

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:我认为这个例子的特殊之处在于专门化引入了一个新的模板参数。一个“正常”的专门化看起来像这样:

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

然而,这并不是很有用,因为我们希望它适用于任何类型。解决方法是在专门化(S)上引入一个额外的模板参数。据我所知,这个额外的参数必须可以从原始模板的参数中推导出来,在这种情况下,S可以被推导出来,因为S就是没有指针的T


谢谢您的解释。但在我接受答案之前,我想确保我真正理解了您所说的内容,remove_pointer<A>会调用顶部的函数,而remove_pointer<A*>会调用右下角的函数?指针的特化必须与模板一起使用吗?或者它可以通用使用?有没有在线参考资料可以查阅呢? - Mox
是的,你说得对。这里有一个视频详细解释了模板类型推导。他还在某个时候提到了特化引入额外模板参数的情况。我也会编辑答案,尝试让它更清晰明了。 - 463035818_is_not_a_number

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接