模板
函数模板
template<typename T> // 声明一个模板 告诉编译器后面出现的T不要报错 是一个通用的数据类型
void mywsap(T& a, T& b)
{
int temp = a;
a = b;
b = temp;
}
void test01()
{
int a = 12;
int b = 13;
mywsap(a, b); // 自动类型推导
//mywsap<int>(a, b); // 显示指定类型 表示上面的T指的是int类型
cout << "a = " << a << "b= " << b << endl;
}
int main()
{
test01();
return 0;
}
注意事项
注意事项1
template<typename T> // 声明一个模板 告诉编译器后面出现的T不要报错 是一个通用的数据类型
void mywsap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
void test01()
{
int a = 10.5;
int b = 13;
double c = 12.3;
mywsap(a, b); // 自动类型推导
// mywsap(a, c);错误 编译器推导不出一致的数据类型
//mywsap<int>(a, b); // 显示指定类型 表示上面的T指的是int类型
cout << "a = " << a << " b= " << b << endl;
}
int main()
{
test01();
return 0;
}
注意事项2
解决方案
案例
// 一个模板对应一个函数 若是还想继续用模板 就要重新声明一个模板
template<typename T> // 声明一个模板 告诉编译器后面出现的T不要报错 是一个通用的数据类型
void mysort(T arr[], int len)
{
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
if (arr[i] < arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
template<typename T>
void printarr(T arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void test01()
{
char chararr[] = "bcad";
int m_len = sizeof(chararr) / sizeof(char);
mysort(chararr, m_len);
printarr(chararr, m_len);
int intarr[] = { 2, 1, 4, 12, 11 };
int len = sizeof(intarr) / sizeof(int);
mysort(intarr, len);
printarr(intarr, len);
}
int main()
{
test01();
return 0;
}
普通函数和函数模板的区别
普通函数和函数模板的调用规则
void myprint(int a, int b)
{
cout << "普通函数的调用" << endl;
}
template <class T>
void myprint(T a, T b)
{
cout << "函数模板的调用" << endl;
}
template <class T>
void myprint(T a, T b, T c)
{
cout << "函数模板三个参数的调用" << endl;
}
void test()
{
int a = 10;
int b = 29;
int c = 23;
char d = 'c';
char f = 'd';
myprint(a, b);// 这时候 会优先调用普通函数
myprint<>(a, b); // 可以通过空模板来参数列表来强制调用函数模板
myprint(a, b, c); // 函数模板会发生函数重载
myprint(f, d);// 如果函数模板可以产生更好的匹配 优先调用函数模板
}
int main()
{
test();
return 0;
}
模板的局限性
class Person
{
public:
int m_age;
string m_name;
Person(string name, int age)
{
m_age = age;
m_name = name;
}
};
template<class T>
bool mycompare(T &a, T &b)
{
if (a == b)
{
return true;
}
else
return false;
}
template<> bool mycompare(Person &p1, Person &p2)
{
if (p1.m_age == p2.m_age && p1.m_name == p2.m_name)
{
return true;
}
else
return false;
}
void test()
{
int a = 12;
int b = 112;
if (mycompare(a, b))
{
cout << "a == b" << endl;
}
else
cout << "a != b" << endl;
Person p1("张三", 12);
Person p2("李四", 12);
if (mycompare(p1, p2))
{
cout << "p1 == p2" << endl;
}
else
cout << "p1 != p2" << endl;
}
int main()
{
test();
return 0;
}