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
- C和C++中泛型编程 - 适应不同类型参数的函数
- C++(8):指向不同类型变量或函数的pointer
- c函数编程之指针参数和指向指针的指针参数
- C和C++__带默认值参数的函数说明
- C和C++__带默认值参数的函数说明
- 【C/C++】main函数的参数argc和argv
- imshow()函数:参数是不同类型的情况
- linux下c编程main函数的参数问题
- C语言编程中对于函数参数的一些解释?
- linux下c编程main函数的参数问题
- linux下c编程main函数的参数问题
- C和C++函数指针作为函数参数的区别
- C 不同类型指针的相互转化
- C/C++实现多参数函数编程
- Linux C编程--main函数参数解析
- Linux C编程--main函数参数解析 .
- C/C++实现多参数函数编程
- Linux C编程 main函数参数解析
- 程序员前进的一小步,能够看懂并翻译英文文章
- MapReduce的核心资料索引
- UVa 10344 - 23 out of 5
- shell学习4:管道的神奇魔力
- 静态路由与默认路由( 原理+区别+实例)
- C和C++中泛型编程 - 适应不同类型参数的函数
- CoolHash数据库的产品宣言(Fourinone4.0版)
- 4.3.2 The Primes
- 读书笔记:计算机网络第7章:阻塞控制
- linux常用命令大全
- shell学习5:变量,判断,重复动作
- 割点和桥 poj1144
- 给出n个会议的起始时间和结束时间,如何快速计算是会议是否和其他会议有冲突?
- 用JIRA管理你的项目——(一)JIRA环境搭建