第2章 C++模板技术
/* 第2章 C++模板技术 2.1 函数模板 2.2 类模板 2.3 模板完全特化 2.4 函数模板重载 2.5 类模板继承 2.6 本章小结 */ //第2章 C++模板技术 // 2.1 函数模板 ---------------------------------------------------------------------------------------------------- // p 26 #include <stdio.h> template <class T> T max(T a, T b) { return a> b ? a : b; } int main(void) { printf("%d\n", max < int > (3, 10)); printf("%f\n", max < double > (16.9, 2.8)); return 0; } // 27 #include <stdio.h> template <class T1, class T2> T1 max(T1 t1, T2 t2) { return static_cast<T1> (t1> t2 ? t1 : t2); } int main(void) { printf("%f\n", max(10.9, 3)); return 0; } // 2.2 类模板 ---------------------------------------------------------------------------------------------------- // p 28 , my test #include <cstdio> #include <typeinfo> int main(void){ int i(3); printf("%s\n",typeid(i).name()); return 0; } // 28 #include <stdio.h> #include <typeinfo.h> template <class T1, class T2> class A { T1 i; T2 j; public: A(T1 t1, T2 t2) { i = t1; j = t2; } bool comp() { return i > j; } void print_Type(); }; template <class T1, class T2> void A<T1, T2>::print_Type() { printf("i的类型是%s\n", typeid(i).name()); printf("j的类型是%s\n", typeid(j).name()); } int main(void) { A < int, double > a(3, 67.8); if(a.comp()) printf("i>j \n"); else printf("i<=j \n"); a.print_Type(); return 0; } // 2.3 模板完全特化 ---------------------------------------------------------------------------------------------------- // 28 #include <stdio.h> template <class T> void func(T a) { printf("hello\n"); } //函数模板完全特化 template <> void func<int> (int a) { printf("hello there\n"); } int main(void) { func(2); //打印hello there func('y'); //打印hello return 0; } // 29 #include <stdio.h> //类模板A template <class T> class A { T i; public: A(T t) { i = t; } T compute() { return i *i; } }; //类模板A的完全特化 template <> class A<int> { int i; int k; //添加新数据成员 public: A(int t) { i = t; printf("hello\n"); } //添加打印 int compute() { return i *i * i; } //改为立方计算 void f(){} //添加新成员函数 }; int main(void) { A < double > dObj(2.5); A < int > iObj(5); //打印hello printf("%f\n", dObj.compute()); //平方计算6.25 printf("%d\n", iObj.compute()); //立方计算125 return 0; } // 2.4 函数模板重载 ---------------------------------------------------------------------------------------------------- // 30 #include <stdio.h> template <class T> void func(T a) { printf("使用func(T a)模板\n"); } //函数模板的重载 template <class T1, class T2> int func(T1 t1, T2 t2) { printf("使用func(T1 t1, T2 t2)模板\n"); return 1; } int main(void) { func(30, 60); //使用重载的函数模板 func(19); return 0; } // 2.5 类模板继承 ---------------------------------------------------------------------------------------------------- // 30-31 #include <stdio.h> template <class T> class A { public: void func(T a) { printf("使用func(T a)成员函数模板\n"); } }; template <class T1, class T2> class B: public A<T1> { public: void func(T1 t1, T2 t2) { printf("使用func(T1 t1, T2 t2)成员函数模板\n"); } }; int main(void) { B < int, double > b; b.func(30, 60); A < int > a = static_cast < A < int > > (b); a.func(10); return 0; } // 2.6 本章小结 ----------------------------------------------------------------------------------------------------