C++的模板函数初探

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

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


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

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


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

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

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


#include
using namespace std;

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

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

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

发表评论