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中能够运用系统提供的模板
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)