//参考博客
//1.https://blog.csdn.net/low5252/article/details/94654468
//2.https://blog.csdn.net/low5252/article/details/94622335
//3.https://www.runoob.com/w3cnote/c-templates-detail.html
#include <iostream>
#include <string>
using namespace std;
//1.函数模板 class关键字也可用typename关键字替代
template<class T, class T2>
void swap1(T& x, T& y, T2& z)
{
T temp = x;
x = y;
y = temp;
y = z;
}
//2.编译器由模板自动生成函数的过程叫模板的实例化。由模板实例化而得到的函数称为模板函数。
//3.在某些编译器中,模板只有在被实例化时,编译器才会检查其语法正确性。
//4.模板实例化并非只能通过形参,主动指明要用哪种类型也可以。
template <class T>
T fun1(T n)
{
return n + 1;
}
//5.类模板
template <class T>
class A
{
public:
A(T t)
{
this->t = t;
}
T &getT()
{
return t;
}
void fun_aaa(T &t);
private:
T t;
};
//6.类模板成员函数在类外定义
template<class T>
void A<T>::fun_aaa(T &t)
{
//
}
//7.类模板派生
template<class T>
class Car
{
public:
Car(T t)
{
this->t = t;
}
void out()
{
cout << t << endl;
}
private:
T t;
};
//从模板类派生时,需要具体化模板类,C++编译器需要知道基类的数据类型
class Toyota : public Car<string>
{
public:
Toyota(int money, string from) : Car<string>(from)
{
this->money = money;
}
void out()
{
Car::out(); //Car<string>::out();
cout << money << endl;
}
private:
int money;
};
void main()
{
//例1:函数模板
{
int a = 1;
int b = 3;
double c = 5;
swap1(a, b, c);
}
//例2:明确实例化类型
/*
double fun1(double n)
{
return n + 1;
}
*/
{
int a = 8;
cout << fun1<double>(a) / 2 << endl; //输出4.5
}
//例3:类模板
{
A<int> a(2);
}
//类模板的模板形参类型,必须在类名后的<>中明确指定
//例4:类模板派生
string from = "Japan";
Toyota car1(200000, from);
car1.out();
system("pause");
return;
}
//todo 先到这