标签:参数类型 必须 迭代 return 列表 不能 格式 接受 自动
编程实现shared_ptr;
实例化:通过用具体值代替模板中的参数,从而产生普通类,函数或者成员函数的过程。
隐式实例化:Add(a,c),a的类型是int,c的类型是int。
显式实例化:Add
特化:
函数的模板特化
使用模板时会遇到一些特殊的类型需要特殊处理,不能直接使用当前的模板函数,所以此时我们就需要对该类型特化出一个模板函数(就是写出一个模板函数专门给该类型使用)。
注意:
使用模板特化时,必须要先有基础的模板函数(就是上面第一个模板函数)
使用特换模板函数时格式有要求:
template<> // 此处不添加类型模板,直接使用空即可
bool Isequal<char*>(char*& p1, char*& p2){
return strcmp(p1, p2) == 0;
}
类模板特化
全特化:
template <class T1, class T2>
class Test{
}
//全特化
template <> //此处同函数模板的特化一样不用写内容
class Test<int , char>{
}
偏特化:(迭代器萃取技术)
部分特化:
template <class T1, class T2>
class Test2{
}
//部分特化
template <class T1> //此处只需写未进行特化的模板类型,特化过的就不用写
class Test2<T1 , char>{//第二个参数类型,只接受char类型,第一个类型不变
}
限制模板类型:
template <class T1, class T2>
class Test2{
}
//对模板类型的范围做出一定的限制
template <class T1 , class T2 > //此处只需写未进行特化的模板类型
class Test2<T1* , T2*>{//只接受T1和T2类型的指针
}
优先选择:有特殊到一般,当一个调用一个模板类,首先,找显式实例化的,如果不匹配;接着,找特化的,然后,找偏特化的,最后,根据模板隐式实例化 。对于模板函数,先找参数完全匹配的普通函数(非由模板实例化得到的函数)。再找参数完全匹配的模板函数。再找实参经过自动类型转换后能够匹配的普通函数。
如果上面的都找不到,则报错。
模板参数:
动态绑定发生在运行时,静态绑定发生在编译时。
class B
{
void DoSomething();
virtual void vfun();
}
class D : public B
{
void DoSomething();
virtual void vfun();
}
D* pD = new D();
B* pB = pD;
//静态绑定
pB -> DoSomething();
pD -> DoSomething();
//动态绑定
pB->vfun();
pD->vfun();
标签:参数类型 必须 迭代 return 列表 不能 格式 接受 自动
原文地址:https://www.cnblogs.com/hang-shao/p/12743652.html