泛型编程主要集中在:泛 型 =》数据类型“泛”
泛也可以说是模糊的意思,就是说这是一种将数据类型透明化的编程方式。
泛型编程的大概想法就是用模板的概念,向各个数据类型都提供编程接口,实现同一种功能,
替代:每一种数据类型的同一种功能都去实现重复的代码。
模板:函数模板 && 类模板
(一)函数模板
1.demo:
template<typename T>
T hello(T x)
{
return x + x;
}
int main(int argc, char **argv)
{
int x = 2;
int ret_i = hello(x);
cout << ret_i << endl;//output:4
string s = "str";
string ret_s = hello(s);//output:strstr
cout << ret_s << endl;
return 0;
}
由上可见:int 和 string 类型 的加法运算(同一种实现方式)只用一份代码就实现了.
Note1:不同类型,但是运算符操作一定要被允许,当然也可以自己在类中重载运算符.
Note2:
template<typename T>
T hello(T x)
{
return x + x;
}
其中typename 还可以是class 关键字,可以有多个参数如:
template<typename T1, typename T2>
T1 hello(T1 x, T2 y)
{
/*opt*/
return xxx;
}
返回值一般为T1。
(二)类模板
1.demo
template <class T1, class T2>
class TemplateClass {
private:
T1 value1;
T2 value2;
protected:
public:
TemplateClass() {}
~TemplateClass() {}
T1 func(T1 x, T2 y);
};
template <class T1, class T2>
T1 TemplateClass<T1, T2>::func(T1 x, T2 y)
{
cout << "T1:" << x << endl;
cout << "T2:" << y << endl;
return 2*x;
}
int main(int argc, char **argv)
{
int x = 2;
string y = "carl";
TemplateClass<int, string> tmp;
int m = tmp.func(x, y);//正常输出
cout << "m = " << m << endl; //output:4
return 0;
}
Note1:当类成员定义在类外部时,形如:
template <class T1, class T2>
T1 TemplateClass<T1, T2>::func(T1 x, T2 y) { /**/ }
Note2:多参数模板的参数类型可不一致。
(三)穿越透明
虽然模板是对程序员透明的,但实际上是编译器根据传入数据的类型,自动推导参数类型,并生成真正带类型的模板(函数、类)
Note:比如函数(or 类)模板编译后的链接地址为A1,那么编译器生成带类型的函数(or 类)的链接地址在A2。(不同类型参数组合会生成多个)
他们是独立的。(可编程获取地址测试)
int main(int argc, char **argv)
{
TemplateClass<int, string> *ptr1 = new TemplateClass<int, string>;
TemplateClass<int, int> *ptr2 = new TemplateClass<int, int>;
cout << ptr1 << "\t" << ptr2 << endl;
delete ptr1;
ptr1 = nullptr;
delete ptr2;
ptr2 = nullptr;
return 0;
}
output:0071D760 0071E3C0
印证之!