C++使用函数模板
函数模板:
函数模板是蓝图或处方功能,编译器使用其发电功能系列中的新成员。
第一次使用时,新的功能是创建。从功能模板生成的函数的实例称为模板或模板的实例。函数模板的开始是keywordtemplate,表示这是一个模板。
其后是一对尖括号,它包括了參数列表。
在使用从模板中生成的函数之前,必须确保把声明(即原型)或模板的定义放在源文件里。模板的实例化仅仅生成一次。
假设兴许的函数调用须要同一个实例,就会调用已经创建好的实例,即使同一个实例在不同的源文件里生成,程序也仅会包括该实例定义的一个副本。
使用时须要注意两个问题:
第一,函数模板本身不做不论什么工作,它是编译器用于从函数调用中创建函数定义的处方或蓝图。
第二。全部工作都在编译和链接过程中完毕。
编译器使用模板生成函数定义的源码。再编译这些代码。链接程序的作用是仅把函数的一个实例链接到可运行模块上,即使几个不同的源文件调用同一个实例。也仅仅链接一个实例。在运行程序时,源码中是否存在模板根本不重要。
显示指定模板參数:
在调用函数时,能够显示指定模板的參数,以控制使用哪个版本号的函数。编译器不再判断用于替换T的类型,仅仅是接受指定的版本号。
在下列情形下,比較实用:
1、函数调用不是非常确切,编译失败。
此时能够使用该技巧帮助编译器去除不确定性。
2、在一些情况下,编译器不能判断出模板參数,因此无法选择要使用哪个版本号的函数。
3、为了避免有太多的函数版本号(从而避免过多占用内存)。能够强迫函数调用使用某个版本号的函数。
模板的说明:
对于某个參数值(在有多个參数的模板中,就是一组參数值)。模板的说明定义了它不同于标准模板的动作。模板说明的定义必须放在原语句的声明或定义之后。 假设把说明放在前面,程序就不会编译。
说明的定义以keywordtemplate开头,但要省略參数。所以原声明中模板參数外部的尖括号就是空的。必须定义说明的參数值。并且必须放在模板函数后面的尖括号里。以下看演示样例:
演示样例:
#include <iostream>
using std::cout;
using std::endl;
//模板声明
template<class T> T larger(T a,T b);
//模板说明声明
template<> long* larger<long*>(long* a,long* b);
int main(int argc,char* argv[]){ cout<<"Larger of 1.5 and 2.5 is "<<larger(1.5,2.5)<<endl; int a_int=35;
int b_int=45;
cout<<"Larger of "<<a_int<<" and "<<b_int<<" is "
<<larger(a_int,b_int)<<endl; long a_long=9;
long b_long=8;
cout<<"Larger of "<<a_long<<" and "<<b_long<<" is "
<<larger(a_long,b_long)<<endl; //显示指定模板參数
cout<<"Larger of "<<a_int<<" and "<<b_int<<" is "
<<larger<long>(a_int,b_int)<<endl; //调用模板说明
cout<<"Larger of "<<a_long<<" and "<<b_long<<" is "
<<*larger(&a_long,&b_long)<<endl;
return 0;
}
//模板定义
template <class T> T larger(T a,T b){
cout <<"standard version"<<endl;
return a>b? a:b;
}
//模板描述定义
template <> long* larger<long*>(long* a,long* b){
cout <<"specialized version"<<endl;
return *a>*b?a:b;
}
C++使用函数模板的更多相关文章
- c++函数模板作为类的成员函数,编译报错LNK2019的解决方法
为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...
- C++STL - 函数模板
模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...
- 使用getopt_long来解析参数的小函数模板
getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...
- C++函数重载和函数模板
1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...
- 零值初始化&字符串常数作为函数模板参数
1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void ...
- 让gcc支持成员函数模板的trick
让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 gcc 4.7.3 不支持成员 ...
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
[源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...
- Effective C++ -----条款45:运用成员函数模板接受所有兼容类型
请使用member function templates(成员函数模板)生成”可接受所有兼容类型“的函数. 如果你声明member templates 用于“泛化copy构造”或“泛化assignme ...
- c++ 左值右值 函数模板
1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...
- 读书笔记_Effective_C++_条款四十五:运用成员函数模板接受所有兼容类型
比如有一个Base类和一个Derived类,像下面这样: class BaseClass {…}; class DerivedClass : public BaseClass {…}; 因为是父类与子 ...
随机推荐
- Android应用开发学习笔记之ContentProvider
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz ContentProvider用于为其它应用程序提供共享数据,它为不同应用程序间共享数据提供了统一的操作接口. 一. ...
- [置顶] dubbo管理控制台安装
dubbo管理控制台开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能. 1.下载dubbo 地址:http://code.alibabatech.com/mvn ...
- ExtJs4 笔记(7) Ext.tip.ToolTip 提示
本篇介绍提示控件,ExtJs支持两种方式定义提示,可以支持普通html元素和一般的ExtJs UI控件. 一.基本提示 Ext.tip.ToolTip 1.最简单的提示 下面通过代码定义一个最简单的提 ...
- Android Fragement学习笔记(三)----PreferenceFragment的使用
相信大家对Perference都比較熟悉了,也就是我们常说的偏好设置,首选项设置,能够保存一些数据,比如我们在上一次使用的时候的一些内容,希望在下一次启动后依旧生效,而不须要再进行配置那么麻烦.一般这 ...
- c#soap调用WebService
辅助类 /// <summary> /// 上传数据参数 /// </summary> public class UploadEventArgs : EventArgs { i ...
- java输出换行的标准姿势"line.separator"
java中写.txt文件,实现换行的几种方法: 1.使用java中的转义符"\r\n": windows下的文本文件换行符:\r\n linux/unix下的文本文件换行符:\r ...
- 14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当INSERT,UPDATE,和删除操作在表上操作, 索引列的 ...
- 打造你自己ajax上传图片
今天,我们需要的图片上传插件,但是,互联网不提供符合他们的需要和易于使用的.所以我写了自己. 方法1,只使用jquery代码,.代码例如以下 <p> <label>上传图片&l ...
- poj 3450 Corporate Identity
题目链接:http://poj.org/problem?id=3450 题目分类:后缀数组 题意:求n个串的最长公共字串(输出字串) //#include<bits/stdc++.h> # ...
- VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布(好像很不错,有六张插图说明)good
为什么要在VS2008中使用QT静态编译呢?很简单,因为VS2008编译器编译出来的文件比mingw编译的要几乎小一半. 好了现在我们来做些准备工作,VS2008自然要安装的,然后打上SP1的补丁.然 ...