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

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

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.h
template<class T>
void swap(T & a, T & b);
#include "swap.cpp"

//swap.cpp
template<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文件中。






你可能感兴趣的:(C++,泛型,模板,C语言,void)