C++泛型编程
模板分为两类,函数模板与类模板
1.函数模板
语法:
template<typename T>
函数声明或定义
#include <iostream>
using namespace std;
template<typename T>
void mySwap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
mySwap(a, b);//自动类型推导
double c = 20.00;
double d = 30.00;
mySwap<double>(c, d);//显示指定类型
cout << a << " " << b << endl;
cout << c << " " << d<< endl;
}
注意:1.tempname可以替换成class
2.自动类型推导必须推导出一致的数据类型才能使用
3.模板必须要确定T的数据类型才能使用
函数模板实现两个不同类型数组排序
#include <iostream>
using namespace std;
template<typename T>
void mySwap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
template <typename T>
void mySort(T arr,int len)//选择排序
{
for (int i = 0; i < len; i++)
{
int max = i;//认定最大值下标
for (int j = i + 1; j < len; j++)
{
if (arr[max] < arr[j])
{
max = j;
}
}
if (max != i)
{
mySwap(arr[max], arr[i]);
}
}
}
void test01() //char数组排序
{
char charArr[] = "hdoemv";
mySort(charArr, sizeof(charArr));
for (int i = 0; i <sizeof(charArr); i++)
{
cout << charArr[i];
}
}
void test02()//int数组排序
{
int intArr[] ={9,6,8,11,62,58,78,96,25,36};
mySort(intArr,sizeof(intArr)/sizeof(int));
for (int i = 0; i < sizeof(intArr) / sizeof(int); i++)
{
cout <<" " << intArr[i];
}
}
int main()
{
test01();
test02();
}
普通函数和函数模板的区别
1. 普通函数调用可以发生隐式类型转换
2. 函数模板 用自动类型推导 不可以发生隐式类型转换
3. 函数模板 用显示指定类型 可以发生隐式类型转换
普通函数和函数模板的调用规则
1.如果普通函数和函数模板都可以实现,优先调用普通函数
2.可以通过空模板参数列表来强制调用函数模板
3.函数模板也可以发生重载
4.如果函数模板可以产生更好的匹配,优先调用函数模板
注意:为避免二义性,不要同时使用普通函数和函数模板
#include <iostream>
using namespace std;
void myPrint(int a,int b,int c)
{
cout << "普通函数" << endl;
}
template<typename T>
void myPrint(T a,T b,T c)
{
cout << "函数模板" << endl;
}
int main()
{
myPrint(10, 20,30);
//空模板参数列表
myPrint<>(10, 20,30);
//有更好的匹配
char a = 'a';
char b = 'b';
char c = 'c';
myPrint(a, b, c);//调用函数模板
}
模板的局限性:
T只能限定为内置的数据类型如果我们要 实现两个自定义数据类型的调用
有两种方法:
1)运算符重载
2)具体化模板
主要利用第二种方法
#include <iostream>
using namespace std;
class Person
{
public:
Person(int age,string name)
{
this->age = age;
this->name = name;
}
int age;
string name;
};
template <typename T>
bool is_equal(T a, T b)
{
if (a == b)
{
return true;
}
else
return false;
}
//具体化模板
template<>bool is_equal(Person a, Person b)
{
if (a.age == b.age && a.name == b.name)
{
return true;
}
else
return false;
}
int main()
{
int a = 10;
int b = 10;
cout << is_equal(a, b) << endl;
Person p1(20, "猴");
Person p2(20, "猴");
cout << is_equal(p1, p2) << endl;
}