• C++函数模板


    目录

    简介

    函数模板的建立

    函数模板注意事项

    普通函数与函数模板的区别

    普通函数和模板函数的调用规则

    函数模板的局限性


    简介

    C++一种编程思想称为泛型编程,主要利用的技术就是模板

    C++提供两种模板机制:函数模板和类模板。这里介绍函数模板,类模板在该专题下的另外篇文章中。

    函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体指定,用一个虚拟的类来表达。

    函数模板的建立

    1. template<typename T>
    2. 函数声明或定义

    template 声明创建模板

    typename 表面其后面的符号是一种数据类型,可以用class代替

    T 通用的数据类型,名称可以替换

    案例:

    1. #include
    2. using namespace std;
    3. template<typename T>
    4. void mySwap(T& a, T& b)
    5. {
    6. T temp = a;
    7. a = b;
    8. b = temp;
    9. }
    10. int main()
    11. {
    12. int a = 10,b = 20;
    13. //1.自动类型推导
    14. mySwap(a, b);
    15. cout << "a="<" b=" << b << endl;

    函数模板注意事项

    1.自动类型推到必须推出一致的数据类型T才可以使用

    2.模板必须要确定出T的数据类型才能够使用

    1. #include
    2. using namespace std;
    3. template<typename T>
    4. void mySwap(T& a, T& b)
    5. {
    6. T temp = a;
    7. a = b;
    8. b = temp;
    9. }
    10. template<typename T>
    11. void fun() {
    12. cout << "fun调用" << endl;
    13. }
    14. int main()
    15. {
    16. //1.模板必须T一致
    17. int a = 10;
    18. double b = 20;
    19. //mySwap(a, b);错误
    20. //2.模板必须确定T类型才可以使用
    21. fun<int>();
    22. return 0;
    23. }

    普通函数与函数模板的区别

    1.普通函数调用时可以发送自动类型转换(隐式类型转换)

    2.函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换

    3.如果利用显示指定类型的方式,可以发生隐式类型转换

    1. #include
    2. using namespace std;
    3. //普通函数
    4. int myAdd01(int a, int b) {
    5. return a + b;
    6. }
    7. //函数模板
    8. template<typename T>
    9. T myAdd02(T a, T b) {
    10. return a + b;
    11. }
    12. int main()
    13. {
    14. int a = 10;
    15. int b = 20;
    16. char c = 'c';
    17. cout << myAdd01(a, c) << endl;
    18. //myaddd02(a,c)报错
    19. cout<<myAdd02<int>(a, c)<//正确,显示指定类型可以发生隐式类型装好
    20. return 0;
    21. }

    普通函数和模板函数的调用规则

    1.如果函数模板和普通函数都可以实现,优先调用模板函数

    2.可以通过空模板参数列表来强制调用函数模板

    3.函数模板也可以发生重载

    4.如果函数调用可以产生更好的匹配,优先调用函数模板

    函数模板的局限性

    1. template<class T>
    2. void f(T a, T b)
    3. {
    4. a = b;
    5. }

    这里的传入a和b是一个数组就无法实现了

    1. template<class T>
    2. void f(T a, T b)
    3. {
    4. if(a > b) { ... }
    5. }

    这里如果传入的数据类型T是一个Person这样的自定义数据类型,也无法正常运行

    为了解决这种问题,提供模板的重载,可以为这些特定类型提供具体化的模板

    1. #include
    2. using namespace std;
    3. class Person {
    4. public:
    5. Person(string name,int age) {
    6. this->m_name = name;
    7. this->m_age = age;
    8. }
    9. string m_name;
    10. int m_age;
    11. };
    12. //普通函数模板
    13. template<class T>
    14. bool myCompare(T& a, T& b) {
    15. if (a == b)
    16. return true;
    17. return false;
    18. }
    19. //具体化,显示具体化的类型以temlate<>开头,并通过名称来指出类型
    20. //具体化优先于常规模板
    21. template<> bool myCompare(Person& p1, Person& p2) {
    22. if (p1.m_name == p2.m_name && p1.m_age == p2.m_age)
    23. return true;
    24. return false;
    25. }
    26. int main()
    27. {
    28. Person p1("p1", 10);
    29. Person p2("p2", 10);
    30. if (myCompare(p1, p2))
    31. cout << "yes" << endl;
    32. else
    33. cout << "no" << endl;
    34. return 0;
    35. }

  • 相关阅读:
    VUE+ts项目配置--alias别名配置
    MinGW——检查版本的命令
    13.10其他集合类(血干JAVA系类)
    2023 海外工具站 3 月复盘
    串口数据接收
    力扣20-有效的括号——栈实现
    vscode连接远程Linux服务器及免密登陆
    【LeetCode】21. 合并两个有序链表
    【Python】将json字符串配置存储为.py配置文件
    MES系统助力注塑企业降本增效~MES系统厂商~先达智控
  • 原文地址:https://blog.csdn.net/l_ethan/article/details/126073458