您的位置:首页 > 编程语言 > C语言/C++

C++ 函数模板小结

2017-04-14 16:36 211 查看
一般而言, 模板分为 函数模板 和 类模板,下面就函数模板进行一下总结。

1、函数模板的定义和使用

定义一个模板函数的格式并不复杂, 如下:

template <模板参数列表>

返回类型 函数名(函数参数列表)

{

        // code ...

}

下面, 举个例子来说明模板函数的作用和用法:

#include <tchar.h>
#include <stdio.h>//printf
#include <stdlib.h>//system

//定义一个函数模板,用来实现任意类型数据的相互交换
template<typename T>
void swap(T &a, T &b)
{
T _temp = a;
a = b;
b = _temp;
}

//
int _tmain(int argc, _TCHAR* argv[])
{
int nNum1 = 50;
int nNum2 = 30;
double dNum1 = 1.23456;
double dNum2 = 6.54321;
char *pszFirst = "Hello";
char *pszSec = "world!";

swap<int>(nNum1, nNum2); // 将swap函数模板实例化为int类型的模板函数再调用
printf("nNum1 = %d, nNum2 = %d\r\n", nNum1, nNum2);

swap<double>(dNum1, dNum2);
printf("dNum1 = %f, dNum2 = %f\r\n", dNum1, dNum2);

swap<char *>(pszFirst, pszSec);
printf("pszFirst = %s, pszSec = %s\r\n", pszFirst, pszSec);

system("pause");
return 0;
}

        我们编写的void swap(T& a, T& b),只是一个“函数模板”。要使用它,需要先将它实例化为一个"模板函数"(如:swap <int>)。编译器在编译此程序的时候,为每个调用此模板的代码生成了一个函数。

关于函数模板,有以下几个方面需要知道:

函数模板并不是函数,它仅在编译时根据调用此模板函数时传递的实参类型来生成具体的函数体!若函数模板没有被调用,则不生成任何代码,也不对模板代码作任何语法检查。
在模板类型参数中, 实参与形参要求严格匹配,它不会进行任何的类型转换。
对于函数模板,我们在调用时不一定必须先将它实例化为一个函数也是可以的,编译器会自动的识别模板的类型。(换句话说:代码可以直接使用swap, 而不需要<>)

2、 函数模板的重载

当编写的一个模板无法满足所有需要的情况时,就需要对模板进行重载(或叫特例化),例如:我们编写了一个较大值的模板Max:
template <typename T>
T const& Max(T const& a, T const& b)
{
return a < b ? b : a;
}

A、 当我们需要传入两个指针类型的实参时,该模板就失效了,需要重载该模板:
template <typename T>
T const& Max(T* const& a, T* const& b)
{
return *a < *b ? *b : *a;
}


B、 倘若我们再需要比较两个字符串大小时,上面两个模板都失效了。因为char* 并没有提供 operator < 运行,我们只能通过调用strcmp库函数自己实现一个Max模板的特例:
const char* Max2(const char*& a, const char*& b)
{
return strcmp(a, b) < 0 ? b : a;
}

说明:
C++模板机制规定,如果一个调用,既匹配普通函数,又能匹配模板函数的话,则优先匹配普通函数。因此,当我们模板特例化的时候,会先匹配特例化的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: