函数模板

//函数模板的定义语法---------------------------------------

template  <typename T1,  typename T2, ... typename Tn>

//或者 template  <class T1,  class T2, ... class Tn>

返回值类型  函数名 (形式参数表)

{

        语句块

}

//------------------------------------------------------------------

 

//函数模板定义eg:

//template 的意思是告诉c++编译器我要进行泛型编程了,不要看到T随便报错

template <typename T>  //template<class T>

void myswap(T&a, T&b)

{

       T temp = a;

       a = b;

       b = temp;

 

//函数模板的调用形式

//1 . 显示类型调用

//2. 自动类型推导

//eg:

int main()

{

       int x = 10;

       int y = 20;

        myswap<int>(x, y);//显示类型调用

 

        char a = 'c';

        char b = 'd';

        myswap(a, b);//自动类型推导

        

        return 0;

}

 

//------------------------------------函数模板和普通函数 的重载------------------

 

template <typename T>  //template<class T>

void myswap(T&a, T&b)

{

       T temp = a;

       a = b;

       b = temp;

 

 

void myswap(int a,   char b)

{

 

    T temp = a;

       a = b;

       b = temp;

}

void myswap(char a,   char b)

{

 

    T temp = a;

       a = b;

       b = temp;

 

}

 

 

int maini()

{

     int a = 0;

     char c = '1';

     double u = 1.0;

     myswap(a, c);//void myswap(int a,   char b)

     myswap(c, a);//void myswap(int a,   char b)---普通函数存在类型的隐式转换

     myswap(a, a);//void myswap(T&a, T&b)  --函数模板“严格”按照类型匹配

     myswap(c, c);//void myswap(char a,   char b)  --当普通函数和函数模板都符合调用时,编译器优先选择普通函数

     myswap<>(c, c);//void myswap(T&a, T&b)--若要强制选择函数模板,添加参数化列表,即空的<>

     myswap(u, u);//void myswap(T&a, T&b)--如果函数模板能产生更好的匹配,则选择函数 

     //函数模板和普通函数之间可以实现重载

      return ;

}

 

//------------------------函数模板机制--------------------

-E  预处理  (包括宏展开) 生成 .i 文件

-S  编译    生成 .s 汇编程序文件

-c  生成可重定位二进制目标程序 .o

通过链接器把.o文件 等压制成可执行程序exe

 

//编译源码成汇编

g++ -S  xxx.cpp -o xxx.s

 

c++编译器进行两次编译,第一次编译在声明的地方对函数模板进行语法分析、语法分析、句法分析,生成一个简陋的函数原型,第二次编译时根据调用的函数参数类型生成新的具体的函数原型,和普通函数放在一起的,所以能重载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字正腔圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值