C和C++中泛型编程 - 适应不同类型参数的函数

来源:互联网 发布:天天饮食软件说明 编辑:程序博客网 时间:2024/06/05 13:22

      首先一个简单的问题,如何实现交换两个整数的值? 想必每个有编程经验的人都能作答。

C语言用指针实现如下:

void swap(int * a, int * b){    int tmp = *a;    *a = *b;    *b = tmp;}

C++可以使用引用实现如下:

void swap(int & a, int & b){    int tmp = a;    a = b;    b = tmp;}

顺便记录另外两个很有意思的实现,不用中间变量tmp (面试中可能会问到):

void swap(int & a, int & b){    a = a + b;    b = a - b;    a = a - b;}

void swap(int & a, int & b){    a = a ^ b;    b = a ^ b;    a = a ^ b;}

      然后,言归正传,假如需要实现任意相同类型两数交换值应该怎么办呢? 比如需要交换两整数、两浮点数或者两个字符。这时,为每种情况编写函数实现显得冗余, 可以采用泛型编程的方法。C语言中泛型编程需要用到 void*(指向任意类型的指针), C++中则采用函数模板。

新问题的C语言实现如下:

void swap(void * a, void * b, int size){    char * tmp = malloc(size * sizeof(char));    memcpy(tmp, a, size * sizeof(char));    memcpy(a, b, size * sizeof(char));    memcpy(b, tmp, size * sizeof(char));    free(tmp);}

注意:无法对void*直接解引用,所以函数参数需要额外一个size参数标示出 void *指向的数据类型的大小。 相关详细内容可以参考 http://blog.csdn.net/skyline0623/article/details/6164011


新问题的C++函数模板实现如下:

template<class T>void swap(T & a, T & b){    a = a + b;    b = a - b;    a = a - a;}

注意:如果使用C++中的函数模板,很有可能碰到一处很特别的问题,就是如果在函数头文件中只声明,而在swap.cpp中实现的话,需要在声明后再包含.cpp文件, 如

//swap.htemplate<class T>void swap(T & a, T & b);#include "swap.cpp"

//swap.cpptemplate<class T>void swap(T & a, T & b){    a = a + b;    b = a - b;    a = a - b;}

否则编译会报错。还有一种是在.cpp中加入关键字export, 参加http://blog.csdn.net/laixingjun/article/details/8992680

最好的方法是,将函数模板的定义直接放在头文件中,不要在.cpp文件中。






2 0
原创粉丝点击