#include <iostream> using namespace std; //模板就是建立通用的模具,大大提高复用性 //模板不可以直接使用,它只是一个框架 //模板的通用并不是万能的 //泛型编程 //函数模板,类模板 //函数模板利用关键字template //使用函数模板有两种方式,自动类型推导、显示指定类型 //模板的目的是为了提高复用性,将类型参数化 //交换整型函数 void swapInt(int& a, int& b) { int temp = a; a = b; b = temp; } //交换浮点型函数 void swapDouble(double& a, double& b) { double temp = a; a = b; b = temp; } //利用模板 template<typename T> // typename = class void swapMy(T& t1, T& t2) { T temp = t1; t1 = t2; t2 = temp; } void test01() { int a = 10; int b = 20; double c = 30; double d = 40; swapMy(a, b); swapMy<double>(c, d); cout << "int a = " << a << endl; cout << "int b = " << b << endl; cout << "double c = " << c << endl; cout << "double d = " << d << endl; } int main() { test01(); system("pause"); return 0; }
#include <iostream> using namespace std; template<typename T> void swapMy(T& t1, T& t2) { T temp = t1; t1 = t2; t2 = temp; } void test01() { int a = 10; int b = 20; char c = 'c'; //自动类型推导,必须推导出一致的数据类型T才可以使用 //swapMy(a, c); //错误 swapMy(a, b); //正确 } template<typename T> void func() { cout << "func()调用" << endl; } void test02() { //模板必须要确定出T的数据类型才可以使用 func<int>(); } int main() { test01(); test02(); system("pause"); return 0; }
#include <iostream> using namespace std; //利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 //排序规则从大到小,排序算法为选择排序 //分别利用int数组和char数组进行测试 template<typename T> void swapMy(T& t1, T& t2) { T temp = t1; t1 = t2; t2 = temp; } template<typename T> void sortMy(T arr[], int len) { for (int i = 0; i < len; i++) { int max = i; for (int j = i + 1; j < len; j++) { if (arr[j] > arr[max]) { max = j; } } if (max != i) { swapMy(arr[max], arr[i]); } } } template<typename T> void printMy(T arr[], int len) { for (int i = 0; i < len; i++) { cout << arr[i] << " "; cout << endl; } } void test01() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int len = sizeof(arr) / sizeof(int); sortMy(arr, len); printMy(arr, len); } void test02() { char arr[] = "abcdefg"; int len = sizeof(arr) / sizeof(char); sortMy(arr, len); printMy(arr, len); } int main() { test01(); test02(); system("pause"); return 0; }
#include <iostream> using namespace std; //普通函数调用时可以发生自动类型转换 //函数模板调用时,如果利用自动类型推导,不会发生自动类型转换 //如果利用显示指定类型的方式,可以发生自动类型转换 //普通函数 int myAdd01(int a, int b) { return a + b; } //函数模板 template <typename T> T myAdd02(T a, T b) { return a + b; } void test01() { int a = 10; int b = 20; char c = 'c'; cout << myAdd01(a, c) << endl; //myAdd02(a, c); //错误 cout << myAdd02<int>(a, c) << endl; } int main() { test01(); system("pause"); return 0; }
#include <iostream> using namespace std; //如果函数模板和普通函数都可以实现,优先调用普通函数 //可以通过空模板参数列表来强制调用函数模板 //函数模板也可以发生重载 //如果函数模板可以产生更好的匹配,优先调用函数模板 //普通函数 void myPrint(int a, int b) { cout << "普通函数调用" << endl; } //函数模板 template <typename T> void myPrint(T a, T b) { cout << "函数模板调用" << endl; } //重载函数模板 template <typename T> void myPrint(T a, T b, T c) { cout << "重载函数模板调用" << endl; } void test01() { int a = 10; int b = 20; int c = 30; myPrint(a, b); //普通函数调用 myPrint<>(a, b); //函数模板调用 myPrint(a, b, c); //重载函数模板调用 char c1 = 'a'; char c2 = 'b'; myPrint(c1, c2); //函数模板调用 } int main() { test01(); system("pause"); return 0; }
#include <iostream> using namespace std; //模板的通用性并不是万能的 //如果a和b传入的是数组,就无法实现了 template <typename T> void t1(T a, T b) { a = b; } //如果传入的是Preson自定义数据类型,也无法实现 template <typename T> void t2(T a, T b) { if (a > b) { } } //C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供 具体化 模板 class Preson { public: string m_name; int m_age; public: Preson(string name, int age) { this->m_name = name; this->m_age = age; } }; //普通函数模板 template <typename T> bool myCompare(T& a, T& b) { if (a == b) { return true; } else { return false; } } //具体化模板 //具体化优先于常规模板 template<> bool myCompare(Preson& p1, Preson& p2) { if (p1.m_name == p2.m_name && p1.m_age == p2.m_age) { return true; } else { return false; } } void test01() { int a = 10; int b = 20; //内置数据类型可以直接使用通用的函数模板 bool bl = myCompare(a, b); if (bl) { cout << "a = b" << endl; } else { cout << "a != b" << endl; } } void test02() { Preson p1("张三", 20); Preson p2("张三", 20); //自定义数据类型,不会调用普通函数模板 //可以创建 具体化 Preson数据类型模板 bool bl = myCompare(p1, p2); if (bl) { cout << "p1 = p2" << endl; } else { cout << "p1 != p2" << endl; } } int main() { test01(); test02(); system("pause"); return 0; }
#include <iostream> using namespace std; template<class NameType, class AgeType> class Preson { public: NameType m_name; AgeType m_age; public: Preson(NameType name, AgeType age) { this->m_name = name; this->m_age = age; } void showPreson() { cout << "name = " << this->m_name << endl; cout << "age = " << this->m_age << endl; } }; void test01() { Preson<string, int> p("张三", 20); p.showPreson(); } int main() { test01(); system("pause"); return 0; }
#include <iostream> using namespace std; //类模板没有自动类型推导的使用方式 //类模板在模板参数列表中可以有默认参数 template<class NameType, class AgeType = int> class Preson { public: NameType m_name; AgeType m_age; public: Preson(NameType name, AgeType age) { this->m_name = name; this->m_age = age; } void showPreson() { cout << "name = " << this->m_name << endl; cout << "age = " << this->m_age << endl; } }; void test01() { //Preson p1("张三", 20); //错误 Preson<string, int> p2("张三", 20); p2.showPreson(); } void test02() { Preson<string> p("李四", 21); p.showPreson(); } int main() { test01(); test02(); system("pause"); return 0; }
#include <iostream> using namespace std; //普通类中成员函数一开始就可以创建 //类模板中成员函数在调用时才创建 class Preson1 { public: void showPreson1() { cout << "showPreson1()函数调用" << endl; } }; class Preson2 { public: void showPreson2() { cout << "showPreson2()函数调用" << endl; } }; template<class T> class myClass { public: T t; public: void func1() { t.showPreson1(); } void func2() { t.showPreson2(); } }; void test01() { myClass<Preson1> mc; mc.func1(); //错误,函数调用时才会创建成员函数 //mc.func2(); } int main() { test01(); system("pause"); return 0; }
end