结构旁边的<>是做什么的?

Mox*_*Mox 4 c++

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

template<typename T>
struct remove_pointer
{
    typedef T type;
};

template<typename T>
struct remove_pointer<T*>
{
    typedef typename remove_pointer<T>::type type;
};
Run Code Online (Sandbox Code Playgroud)

虽然我确实理解这是模板中的递归定义,但令我困惑的是线条

template<typename T>
struct remove_pointer<T*>
Run Code Online (Sandbox Code Playgroud)

这是否意味着remove_pointer将导致T = int*?为什么T = int**?解释表示赞赏.

for*_*818 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;
};
Run Code Online (Sandbox Code Playgroud)

即在一般情况下type只是T,但如果T是指针,则模板被实例化S,其中T == S*.

PS:我认为这个例子的特殊之处在于专业化引入了一个新的模板参数."正常"专业化将如下所示:

template<>
struct remove_pointer<int*>   // specialization for T = int*
{
    typedef typename remove_pointer<int>::type type;
};
Run Code Online (Sandbox Code Playgroud)

但是,这并不是非常有用,因为我们希望它适用于任何类型.解决方案是在specialization(S)上引入一个额外的模板参数.Afaik这个附加参数必须可以从参数到原始模板S进行推导,在这种情况下可以推导出来,因为S它只是T没有指针.