C++之模板
2018-11-26 07:53:13来源:博客园 阅读 ()
1.函数模板
1 #include<iostream> 2 using namespace std 3 4 int Plus(int a,int b) 5 { 6 int Sum; 7 Sum = a + b; 8 return Sum; 9 } 10 11 double Plus(double a,double b) 12 { 13 double Sum; 14 Sum = a + b; 15 return Sum; 16 }
1 template <class Name> Function 2 template <typename Name> Function
1 #include<iostream> 2 using namespace std; 3 template <class G_Type> 4 G_Type Plus(G_Type a, G_Type b) 5 { 6 G_Type Sum; 7 Sum = a + b; 8 return Sum; 9 } 10 int main() 11 { 12 int a = 10, b = 20, Sum1; 13 double c = 3.14, d = 6.28, Sum2; 14 Sum1 = Plus(10,20); 15 Sum2 = Plus(3.14,6.28); 16 cout << Sum1 << endl; 17 cout << Sum2 << endl; 18 return 0; 19 }
1 Sum1 = Plus(10,20); //可实现 2 Sum2 = Plus(3.14,6.28); // 可实现 3 Sum3 = Plus(3.14,10); //不可实现,这种情况在上述模板就无法实现,为了应对这种多种类型的参数,我们需要对函数模板进行小的修改。 4 template <class G_Type,class U_Type> 5 G_Type Plus(G_Type a, U_Type b) 6 { 7 G_Type Sum; 8 Sum = a + b; 9 return Sum; 10 }
2.类模板
//类模板实现 template<class Name> class Student { public: Name m_Member;//成员函数定义 public: Name m_Add(Name a, Name b);//成员函数声明 };
1 #include <stdio.h> 2 3 //类模板实现 4 template<class Name> 5 class Student 6 { 7 public: 8 Name m_Member;//成员函数定义 9 public: 10 Name m_Add(Name a, Name b);//成员函数声明 11 }; 12 13 //成员函数的外部实现 14 template <class Name> 15 Name Student<Name>::m_Add(Name a, Name b) 16 { 17 return a + b; 18 } 19 20 //主函数 21 int main() 22 { 23 Student<int> stu; 24 printf("stu.m_Add(1,2) = %d \n",stu.m_Add(1,2)); 25 return 0; 26 }
1 //类模板实现 2 template<class Name1,class Name2> 3 class Student 4 { 5 public: 6 Name1 m_Member1; 7 Name2 m_Member2;//成员函数定义 8 public: 9 void m_Add(Name1 a, Name2 b);//成员函数声明 10 }; 11 12 //成员函数的外部实现 13 template <class Name1,class Name2> 14 void Student<Name1, Name2>::m_Add(Name1 a, Name2 b) 15 { 16 return a + b; 17 }
3.模板的特化
1 template <typename T> 2 T add(T a, T b) 3 { 4 printf("T add(T a, T b)\n"); 5 return a + b; 6 } 7 //上述函数不支持int*类型,所以要对传入指针类型参数进行特化。 8 template <> 9 int* add<int*>(int* pa, int* pb) 10 { 11 printf("T add(const int* pa, const int* pb)\n"); 12 *pa += *pb; 13 return pa; 14 } 15 16 int main(void) 17 { 18 int a = 8, b = 6; 19 add<>(&a, &b); //<>,编译器会自动推导数据类型为int* 20 21 return 0; 22 }
1 template <typename T1, typename T2> 2 class TestCls 3 { 4 public: 5 void add(T1 a, T2 b); 6 }; 7 8 template <typename T1, typename T2> 9 void TestCls <T1, T2>::add(T1 a, T2 b) 10 { 11 printf("estCls <T1, T2>::add(T1 a, T2 b) = %d\n", a + b); 12 } 13 14 //部分特化 15 template <typename T> 16 class TestCls <T, T> 17 { 18 public: 19 void add(T a, T b); 20 }; 21 22 template <typename T> 23 void TestCls <T, T>::add(T a, T b) 24 { 25 printf("TestCls <T, T>::add(T a, T b) = %d\n", a + b); 26 } 27 28 int main(void) 29 { 30 TestCls<int, int> t; //编译器会选择特化后的类。 31 //注意<>内不能为空,编译器对类模板不能进行类型推导。 32 t.add(5, 5); 33 return 0; 34 }
1 //完全特化,完全特化后"<>"内为空 2 template <> 3 class TestCls<int, char> //直接指定了T1、T2的类型 4 { 5 public: 6 void add(int a, char b) 7 { 8 printf("TestCls<int, char>::add(int a, char b)\n"); 9 } 10 }; 11 12 int main(void) 13 { 14 TestCls<int, char> t; 15 t.add(5, 5); 16 return 0; 17 }
以上,即本次学习模板后的学习笔记,后续深入学习再持续补充,上述内容如有不足之处,望各位读者批评指正。
leo zhai
Nov,23.2018
leonardozhai@outlook.com
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash