C++的模板函数初探 - IaWeN's Blog - 我喜欢这样自由的随手涂鸦,因为我喜欢风……
Oct 29

C++的模板函数初探 不指定

Posted by iawen at 11:20 | 程序设计 | 评论(0) | 阅读(771) | |
学C++已经有一段时间了,随后的日子却抛到了一边,少有接触和运用到。
这次想重头温习一下,却一下子没有了头绪,都不知道从何处着手。相比C,C++称之为C的超集,所有的C功能都可以在C++运用,相反C++却多出了几个特性:模板编程(泛型?呵呵,泛型与模板是有区别的啦)、OPP编程(类class).

这里只想说一点模板编程的东西。
还是举个简单的例子来说吧,如要求输出2个数中的最大的一个数的功能函数:OutMax.
在传统的C里面要如何实现呢?如两个整形,则会定义成如下:

void OutMax(int param1,int param2){
    if(param1>=param2)
         cout<<param1<<endl;
    else
         cout<<param2<<endl;
}
 


但是这个函数只能接受两个整形的参数,如果要比较两个浮点型的呢??或者在整形与浮点型之间进行比较,而且我们也不知道地个参数在前,那个参数在后!!
在C++里,我们就可以用上了模板编程了……,如下:

template<typename T1,typename T2>
void OutMax(T1 param1,T2 param2){
    if(param1>=param2)
         cout<<param1<<endl;
    else
         cout<<param2<<endl;
}
 


注意这里的template,这是模板定义的关键字,然后在后面的"<>"里定义模板函数需要的类型,这时是T1和T2,前面用关键字typename标明。

好了,下面是一个完整的测试程序:

#include<iostream>
using namespace std;

template<typename T1,typename T2>
void OutMax(T1 param1,T2 param2){
  if(param1>=param2)
    cout<<param1<<endl;
  else
    cout<<param2<<endl;
}

int main(){
  OutMax(1,3);
  OutMax(5.3,3.2);
  OutMax(45,78.12);

  return 0;
}
 


我们编译运行一下,OK,编译和运行一切正常:

E:\Programming\c_cpp>cpptemp
3
5.3
78.12


现在我们用IDA来反分析一下:

.text:00401000                 push    ebp
.text:00401001                 mov     ebp, esp
.text:00401003                 push    3
.text:00401005                 push    1               ; double
.text:00401007                 call    sub_401040
.text:0040100C                 fld     ds:dbl_41B1C0
.text:00401012                 fstp    [esp+8+var_8]
.text:00401015                 sub     esp, 8
.text:00401018                 fld     ds:dbl_41B1B8
.text:0040101E                 fstp    [esp+10h+var_10]
.text:00401021                 call    sub_402270
.text:00401026                 add     esp, 8
.text:00401029                 fld     ds:dbl_41B1B0
.text:0040102F                 fstp    [esp+8+var_8]
.text:00401032                 push    2Dh             ; int
.text:00401034                 call    sub_4022D0
.text:00401039                 add     esp, 0Ch
.text:0040103C                 xor     eax, eax
.text:0040103E                 pop     ebp
.text:0040103F                 retn


上面的是main函数,对同一个函数的调用成了对三个子函数的调用:
1、.text:00401007                 call    sub_401040
2、.text:00401021                 call    sub_402270
3、.text:00401034                 call    sub_4022D0

呵呵,模板编程的功能是在编译端实现和支持的,是编译器根据实际需要生成相应的子函数!


版权所有。转载时必须以链接形式注明作者和原始出处及本声明!如果 对文章有意见,请发邮件到iawen#126.com,或者直接在博客留言。
Tags: , ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]