c++提供两种模板机制:函数模板和类模板
函数模板
建立一个通用函数,函数的返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表
语法:
cpp
template<typename T> //或者 template<class T> 函数声明或定义
当使用class的时候,如果T有子类,编译器会认为是声明,所以还是使用typename吧
cpp
template<typename T> void test(T& a, T& b) { T temp = a; a = b; b = temp; } int main() { int a = 1, b = 2; //自动推导类型 test(a, b); //指定类型 test<int>(a, b); cout << a << "==" << b << endl; }
注意事项:
自动类型推导,必须推导出一致的数据类型T才可以使用
模板必须要确定出T的数据类型,才可以使用
cpp
template<typename T> void test(T& a, T& b) { T temp = a; a = b; b = temp; } int main() { int a = 1, b = 2; char c='1'; //自动推导类型错误,因为两个类型不同 test(a, c); }
cpp
template<typename T> void test() { cout << "hhhh" << endl; } int main() { test();//错误,因为推导不出T是什么类型 }
cpp
template<typename T> void test() { cout << "hhhh" << endl; } int main() { test<int>(); //明确指定就可以 test<string>();//这个也可以 }
普通模板和函数模板区别
- 普通函数调用时可以发生自动类型转换(隐式类型转换)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 函数模板如果利用显示指定的方法,可以发生类型转换
普通函数会发生隐式转换,例如下面的例子中,将char类型的c转换为了int,对应的就是c的ascll
cpp
void print1(int a, int b) { cout << a + b << endl; } int main() { int a = 1; char b = 'c'; print1(a,b); }
而使用模板函数时
cpp
template<typename T> void print(T a,T b) { cout << a+b << endl; } int main() { int a = 1; char b = 'c'; print(a,b); //报错 }
cpp
template<typename T> void print(T a,T b) { cout << a+b << endl; } int main() { int a = 1; char b = 'c'; print<int>(a,b); //除非我们指定了数据类型为int }
普通函数和模板函数的调用规则
- 如果函数模板和普通函数都可以实现,优先调普通函数
- 可以通过空模板参数来强制调用函数模板
- 函数模板也可以发生重载
- 如果函数模板可以产生更好的匹配,优先调用函数模板
如果函数模板和普通函数都可以实现,优先调普通函
cpp
template<typename T> void test(T a) { cout <<"函数模板" << endl; } void test(int a) { cout << "普通函数" << endl; } int main() { int a = 1; test(a); }
结果:普通函数
cpp
template<typename T> void test(T a) { cout <<"函数模板" << endl; } void test(int a); int main() { int a = 1; test(a); }
如果普通函数只有声明也是调用普通函数,会报错没有找到定义
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293146.html