好的,这里从另一个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**?解释表示赞赏.
这是指针类型的特化.专业化也可能有模板参数.所以,这个模板的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;
};
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没有指针.
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |