为了实现与数据类型无关的编程,模板应运而生:

 #include<iostream>
#include<string.h>
using namespace std; template <typename T>
void compare(T *obj1, int size)
{
int i, j;
T temp;
for(i=;i<size;i++)
for (j = i + ; j < size; j++)
{
if (obj1[i] < obj1[j])
{
temp = obj1[i];
obj1[i] = obj1[j];
obj1[j] = temp;
}
} } int main()
{
int a[] = { ,,,,, };
int size = sizeof(a) / sizeof(*a);
compare<int>(a, size);
for (int i = ; i < size; i++)
{
printf("%d ", a[i]);
} char ca[] = "abcdefg";
int csize = strlen(ca);
compare<char>(ca, csize);
printf("%s", ca);
cout << "hello...\n";
return ;
}

模板定义以关键字template开始,后跟模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。当使用模板时,我们隐式或者显式地指定模板实参,将其绑定到模板参数上。(建议都显式指定)。

类型参数前必须使用class或者typename,在模板参数列表中这两个关键字含义相同,可以互换。typename更为直观,但是,typename是在模板已经广泛使用后才引入c++语言的,某些以前的程序,使用class,我们也得知道是什么意思。

模板与非模板代码不同,函数模板和类模板成员函数的定义通常放在头文件中。

当编译器遇到一个模板的定义时,并不生成代码。只有我们实例化出模板的一个特定版本时,编译器才会生成代码。当我使用(而不是定义)模板时,编译器才生成代码这一特性影响了我们如何组织代码以及错误何时被检测到。通常,编译器会在三个阶段报告错误:

1.编译模板本身时,这个阶段编译器通常不会发现很多错误。编译器可以检查语法错误,例如忘记分号或者变量名拼错等,但也就这么多了。

2.编译器遇到模板使用时,在此阶段,编译器任然没有很多可检查的。对于函数模板调用,编译器通常会检查实参数目是否正确,它还能检查参数类型是否匹配。对于类模板,编译器可以检查用户是否提供了正确数目的模板实参,但也仅限于此了。

3.模板实例化时,只有这个阶段才能发现类型相关的错误。依赖于编译器如何管理实例化,这类错误可能在链接时才报告。

保证传递给模板的实参支持模板所要求的的操作,以及这些操作再模板中能正确工作,是调用者的责任。

c++之——template模板函数的更多相关文章

  1. 模板函数(template function)出现编译链接错误(link error)之解析

    总的结论:    将template function 或者 template class的完整定义直接放在.h文件中,然后加到要使用这些template function的.cpp文件中. 1. 现 ...

  2. C++ template学习一(函数模板和模板函数)

    函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:templat ...

  3. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)

    1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 136[Submit][Status ...

  4. c++模板函数实例化的偏序机制

    一:废话 今天在stackoverflow上看到一个关于c++模板specialization的问题: http://stackoverflow.com/questions/18283851/temp ...

  5. angularjs指令系统系列课程(2):优先级priority,模板template,模板页templateUrl

    今天我们先对 priority,template,templateUrl进行学习 1.priority 可取值:int 作用:优先级 一般priority默认为0,数值越大,优先级越高.当一个dom元 ...

  6. C++ 模板函数与模板类

    一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:

  7. ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

    1061: 从三个数中找出最大的数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][We ...

  8. [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断

    参考:http://blog.csdn.net/beyondhaven/article/details/4204345 参考:http://blog.csdn.net/joeblackzqq/arti ...

  9. C++:函数模板与模板函数

    6.1 模板的概念 C++允许用同一个函数定义函数,这些函数的参数个数和参数类型不同.例如求最大值的max函数, int max(int x,int y) {       return (x>y ...

随机推荐

  1. 一个简单的knockout.js 和easyui的绑定

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basi ...

  2. 改变maven父子项目视图为树状

    完毕

  3. 使用git 将自己的本地文件git到github上面的完整过程

    1.  首先在github网站上新建一个仓库,复制仓库地址(HTTP形式或者SSH形式,后者利用SSH,在最后一步push 的时候可以不用输入用户名和密码). 2.  在本地某个你想要的(文件夹)目录 ...

  4. [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)

    1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...

  5. iOS获取设备卸载后不变的UUID

    1.首先导入系统库Security.framework 2.创建文件SFHFKeychainUtils.h如下(复制即可): @interface SFHFKeychainUtils : NSObje ...

  6. 仿京东左侧菜单 hover效果-简易demo

    简单描述: 用到的知识点 css 中的绝对定位 以及 Js 中的事件冒泡(或事件委托) .cont{display:inline-block;width:200px;height:200px;bord ...

  7. asp.net 在线解压缩文件类

    using System; using System.Collections.Generic; using System.Text; using System.IO; using Microsoft. ...

  8. Unix环境高级编程(一)文件I/O

    Unix系统中大多数文件I/O只需用到五个函数:open.read.write.lseek.close.本章说介绍的I/O是不带缓冲的,即:每个read和write都调用内核中的一个系统调用.不是IS ...

  9. 图解IIS配置过程

    环境介绍: 操作系统:win7,64位.IIS7 开发软件:VS2010,32位 图解IIS配置过程: 此过程之前确保已安装了IIS. 1.在"控制面板"中找到"管理工具 ...

  10. VS2010 单元测试,性能测试 案例

    http://www.cnblogs.com/heqichang/category/315226.html