C++模板编程

举报
用户已注销 发表于 2021/11/19 03:59:40 2021/11/19
【摘要】 1,模板函数 像max这种函数,对于参数类型,计算逻辑是一样的,只是入参和返回值类型不同,就可以写成模板函数。 示例: #include<iostream>using namespace std; template<typename T>T maxmax(T a, T b){ return (a > ...

1,模板函数

像max这种函数,对于参数类型,计算逻辑是一样的,只是入参和返回值类型不同,就可以写成模板函数。

示例:


  
  1. #include<iostream>
  2. using namespace std;
  3. template<typename T>
  4. T maxmax(T a, T b)
  5. {
  6. return (a > b ? a : b) + 1;
  7. }
  8. int main()
  9. {
  10. cout << maxmax(1, 2) << endl;
  11. cout << maxmax(1.3, 1.5) << endl;
  12. cout << maxmax("as", "zx");
  13. return 0;
  14. }

输出:

3
2.5
s

但是,不能这么调用:maxmax(1.3,1),这样写会报错

不同于普通函数,这里不能自动把int转换为double

 

2,多类型参数的模板函数

要实现有不同数据类型的入参的函数,就需要多个模板参数。

示例:


  
  1. #include<iostream>
  2. using namespace std;
  3. template<typename T1,typename T2>
  4. T1 maxmax(T1 a, T2 b)
  5. {
  6. return (a > b ? a : b) + 1;
  7. }
  8. int main()
  9. {
  10. cout << maxmax(1, 2) << endl;
  11. cout << maxmax(1.3, 1.5) << endl;
  12. cout << maxmax(1.3, 1) << endl;
  13. cout << maxmax("as", "zx");
  14. return 0;
  15. }

输出:

3
2.5
2.3
s

 

3,模板类

和模板函数语法差不多。

示例:


  
  1. #include<iostream>
  2. using namespace std;
  3. template<typename T>
  4. class GetMax
  5. {
  6. public:
  7. T a;
  8. T b;
  9. GetMax(T a, T b)
  10. {
  11. this->a, this->b = b;
  12. }
  13. T getMax()
  14. {
  15. return a > b ? a : b;
  16. }
  17. };
  18. int main()
  19. {
  20. int a = 1;
  21. cout << GetMax<double>(a, 2.3).getMax();
  22. return 0;
  23. }

有个很重要的区别就是,模板类在调用的时候必须显示的指明类型参数,

所以这里就像普通函数一样,会自动把int类型的数转换为double的数。

 

4,多类型参数的模板类

示例:


  
  1. #include<iostream>
  2. using namespace std;
  3. template<typename T1,typename T2>
  4. class GetMax
  5. {
  6. public:
  7. T1 a;
  8. T2 b;
  9. GetMax(T1 a, T2 b)
  10. {
  11. this->a, this->b = b;
  12. }
  13. T1 getMax()
  14. {
  15. return a > b ? a : b;
  16. }
  17. };
  18. int main()
  19. {
  20. int a = 1;
  21. cout << GetMax<int, double>(a, 3.3).getMax() << endl;
  22. cout << GetMax<double,int>(a, 3.3).getMax();
  23. return 0;
  24. }

输出:

3
3
 

5,默认类型

模板类定义时,类型参数可以指定默认类型。

模板函数不能指定默认类型。

 

6,非类型参数

在定义模板类时,参数列表除了类型参数还可以有变量参数。

示例:


  
  1. #include<iostream>
  2. using namespace std;
  3. template<typename T,int len>
  4. class Num
  5. {
  6. public:
  7. Num(T a)
  8. {
  9. this->num[0] = a;
  10. }
  11. T get()
  12. {
  13. return num[0];
  14. }
  15. private:
  16. T num[len];
  17. };
  18. int main()
  19. {
  20. cout << Num<int, 1>(2.3).get();
  21. return 0;
  22. }

输出:

2

注意,创建模板类实例时,变量参数只能传常量,不能传变量,即使模板类中没有使用这个参数也是这样。

 

7,可继承性

模板类可以继承模板类,模板类可以继承非模板类,

非模板类可以继承模板类,非模板类可以继承非模板类。

 

8,友元

友元的使用,对于模板类和非模板类是一样的。

 

9,静态成员

对于模板类中的静态成员,每个模板特例化都拥有独立的静态数据域拷贝。

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/104628485

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。