函数模板
模板技术,类型参数化,编写代码可以忽略类型
为了让编译器区分是普通函数还是模板函数
// 模板.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
template<typename T>//template<class t>
//告诉编译器,下边是模板函数
void Myswap(T*a, T*b)
{
T temp= *a;
*a = *b;
*b = temp;
//cout << "in a=" << *a << " b=" << *b << endl;
}
template<typename T>
void Myswap1(T&a, T&b)
{
T temp = a;
a = b;
b = temp;
}
void test()
{
int a = 10, b = 20;
double c = 3.0, d = 4.0;
cout << "a=" << a << " b=" << b << endl;
//1.自动类型推导
Myswap(&a, &b);
cout << "a=" << a << " b=" << b << endl;
cout << "c=" << c << " d=" << d<< endl;
//1.自动类型推导,编译器根根据传的值自动推导类型
Myswap1(c, d);
cout << "c=" << c << " d=" << d << endl;
//2显示指定类型
Myswap1<int>(a,b);//不能传 c,d
}
int main()
{
test();
return 0;
}
****函数模板不允许自动类型转换,普通模板可以进行自动类型转换
函数模板可以被重载
编译器优先考虑普通函数,如果模板可以产生更好好的匹配,那么选择模板,如果一定要调用模板,那么要
MyAdd<>(a,b)//加尖括号
类模板
// 模板.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
template<typename T>
class Person {
public:
Person(T id, T age)
{
cout << "hhh" << endl;
this->id = id;
this->age = age;
}
void show()
{
cout << "id " << id << "age" << age << endl;
}
private:
T id;
T age;
};
void test01()
{
//函数模板在调用时可以自动类型推导
//类模板必须显示指定类型
Person<int> p(10, 20);
p.show();
}
int main()
{
test01();
return 0;
}
对char类型和int类型数组进行排序
// 模板.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
template<class T>
void print(T *arr, int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
template<typename 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])
{
T temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
int arr[] = { 1,5,4,2,3,9,6,8 };
int len = sizeof(arr)/sizeof(int);//总长度/单位长度=个数
print(arr, len);
mysort(arr, len);
print(arr, len);
char ch[] = { 'a','h','b','p' };
int len1 = sizeof(ch) / sizeof(char);
print(ch, len1);
mysort(ch, len1);
print(ch, len1);
return 0;
}