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

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

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

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

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

复制代码
 1 int myAdd(int a, int b)
 2 {
 3     return a + b;
 4 }
 5 //函数模板
 6 template<class T>
 7 T myAddT(T a, T b)
 8 {
 9     return a + b;
10 }
11 void test()
12 {
13     int a = 10;
14     int b = 20;
15     char c = 'c';
16     cout << myAdd(a, b) << endl;//30
17     cout << myAdd(a, c) << endl;//109 将字符型c转换为整型数据  c:99+10  = 109
18     cout << myAddT(a, b) << endl;//正确
19     //cout << myAddT(a, c) << endl;//报错   自动类型推导 无法确定 整型 或者字符型
20     cout << myAddT<int>(a, c) << endl;//正确 显示强制转换
21 }
复制代码

总结:使用显示指定类型的方式调用函数模板。          myAddT<int>(a,c);     

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

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

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

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

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

复制代码
 1 void myPrint(int a, int b)
 2 {
 3     cout << "调用普通函数" << endl;
 4 }
 5 template<class T>
 6 void myPrint(T a, T b)
 7 {
 8     cout << "调用模板" << endl;
 9 }
10 template<class T>
11 void myPrint(T a, T b,T c)
12 {
13     cout << "调用重载模板" << endl;
14 }
15 void test()
16 {
17     int a = 1;
18     int b = 2;
19     myPrint(a, b);//调用普通函数
20     //通过空模板参数列表,强制调用函数模板
21     myPrint<>(a, b);//调用模板
22     myPrint(a, b, 1);//调用重载模板
23     //如果函数模板产生更好的匹配  优先调用函数模板 
24     char c1 = 'a';
25     char c2 = 'b';
26     myPrint(c1, c2);//调用模板   普通函数需要强制转换  模板转为T即可 
27 }
复制代码

模板的局限性:    

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 class Person
 4 {
 5 public:
 6     Person(string name, int age)
 7     {
 8         this->m_Name = name;
 9         this->m_Age = age;
10     }
11     string m_Name;
12     int m_Age;
13 };
14 //模板的局限性
15 //1.某些特定数据类型,需要用具体化方式做特殊实现
16 template<class T>
17 bool myCompare(T& a, T& b)
18 {
19     if (a == b)
20     {
21         return true;
22     }
23     else
24     {
25         return false;
26     }
27 }
28 //2.利用具体化Peron的版本实现代码  具体化优先调用
29 template<> bool myCompare(Person &p1,Person &p2)//具体化  template<>
30 {
31     if (p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age)
32     {
33         return true;
34     }
35     else
36     {
37         return false;
38     }
39 }
40 void test()
41 {
42     int a = 10;
43     int b = 20;
44     bool ret = myCompare(a, b);
45     if (ret)
46     {
47         cout << "a == b" << endl;
48     }
49     else
50     {
51         cout << "a != b" << endl;
52     }
53 }
54 void test01()
55 {
56     Person p1("Tom", 10);
57     Person p2("Tom", 11);
58     bool ret = myCompare(p1, p2);// 1.模板此时不会使用Person的比较 2.可以正常用
59     if (ret)
60     {
61         cout << "p1 == p2" << endl;
62     }
63     else
64     {
65         cout << "p1 != p2" << endl;
66     }
67 }
68 int main()
69 {
70     test01();
71     system("pause");
72     return 0;
73 }
复制代码

总结:

  利用具体化的模板    template<>    可以解决自定类型的通用化

  学习模板并不是为了写模板,而是在STL中能够运用系统提供的模板

posted on   廿陆  阅读(16)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示