模板

it2023-11-02  77

函数模板

c++提供了函数模板,所谓的函数模板实际上就是建立一个通用函数,其函数的类型和形参的类型不具体指定,用一个虚拟的类型来进行代表,这个通用的函数就称为函数模板,凡是函数体相同都可以用这个模板代替,不需要定义多个函数,只是需要在模板中定义一次即可,在调用函数的时候系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能

STL通用代码

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; int main(void) { system("pause"); return 0; }

第一个c++ STL程序

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #if 0 //int类型数据交换 void myswap(int &a,int &b) { int temp = a; a = b; b = temp; } //double类型数据交换 void myswap(double& a,double& b) { double temp = a; a = b; b = temp; } #endif//#if 0 ........#endif表示将上述代码注释 //模板技术 类型参数化 编写代码可以忽略类型,为了让编译器区分是普通函数还是模板函数 template<class T>//template<typename T>,告诉编译器下面写的是模板函数,需要注意的是这个语句只对下面的第一个函数有用 void myswap(T& a, T& b) { T temp = a; a = b; b = temp; } void test01() { //自动类型推导 int a = 10; int b = 20; cout << "a:" << a <<" "<< "b:" << b << endl; myswap(a, b);//编译器根据自己传的值进行类型自动推导 cout << "a:" << a <<" " <<"b:" << b << endl; double da = 1.13; double db = 1.24; cout << "da:" << da << " "<<"db:" << db << endl; myswap(da, db); cout << "da:" << da << " "<<"db:" << db << endl; //显示的指定类型 myswap<int>(a, b); } int main(void) { test01(); system("pause"); return 0; } a:10 b:20 a:20 b:10 da:1.13 db:1.24 da:1.24 db:1.13 Press any key to continue . . .

在编译过程中可能遇到的错误:LNK2019无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中被引用 解决方法:在资源解决管理器中找到该项目>>属性>>链接器>>系统>>子系统>>窗口(/SUBSYSTEM:WINDOWS)改为控制台(SUBSYSTEM:CONSOLE)

函数模板和普通函数

调用规则:

函数模板可以像普通函数那样可以被重载 c++编译器会优先考虑普通函数 如果函数模板可以产生一个更好的匹配,那么选择模板 可以通过空模板实参列表的语法限定编译器只能通过模板匹配

区别:

函数模板不允许自动类型转换,模板是严格的类型匹配 普通函数可以自动进行类型转换

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; template<class T> //函数模板必须是严格的类型匹配 int myadd(T a,T b) { return a + b; } //普通函数可以进行自动类型的转换 int myadd(int a, char c) { return a + c; } void test01() { int a = 10; int b = 20; char c1 = 'a'; char c2 = 'b'; myadd(a, b);//如果要调用模板函数则需要加上<>即为myadd<>(a,b); //当调用函数时传入的数据同时符合普通函数和模板函数,首先会先和普通函数匹配,如果匹配不成功在去模板函数中匹配 #if 0 myadd(a, c1); myadd(a, b); myadd(c1, b); #endif } template<class T> void print(T a) { } template<class T> void print(T a,T b) { } int main(void) { test01(); system("pause"); return 0; } c++编译器模板机制 编译器编译的原理 在linux中写一个cpp文件:

按下ESC退出,按下:wq保存退出进入命令行模式, 接下来要编译.cpp文件,在命令行中敲下g++ -E index.cpp -o index.i 就将cpp文件生成.i文件 可以查看index.i的内容 按下g++ -S index.i -o index.s,编译成汇编文件

按下g++ -C index.s -o index.o 生成.o文件 按下g++ index.s -o index 生成可执行文件 通过file index 查看生成的是否是可执行文件,并且通过./index 执行得出最终的结果1024。

模板函数实现原理剖析

最新回复(0)