从事C++挺久了,在前段时看书时,发现高手,都是在写模板无,泛型编程,顿感差距。自己连模板都没有写,于是就小小的研究了下模板的用法。

模板简而言之就是对某此对象的相同方法,或处理方式,进行归纳,总结,生成一个可以处理共同部份,适应多种不同对象的方法。在C语言时代就是宏定义方法。用#define定的一个方法,不过,C时代只是对函数方法的处理,还没有对象概念,这和后来的C++函数模板一样。

1.类模板

请参见

http://www.cnblogs.com/waytofall/archive/2012/06/26/2563642.html

1.函数模板

1.模板函数为不同的模板实参定义了一个函数家族。它的表示看起来和普通的函数很相似,唯一的区别是有些函数元素是未确定的:这些参数将在使用的时候被参数化。

template <typename T>
inline T const& max(T const& a,T const& b)
{
return a<b ? b : a;
}
上述例子中的参数类型没有确定,用模板参数T来代替。
 

2.函数模板的实例化:使用具体的类型代替模板参数的过程。这个过程产生了一个模板的实例。这个过程是在编译的时候进行的。

模板内部的操作要被进行参数的类型所支持,否则会出错。

在编译的时候:

1)实例化前,先检查模板代码本身,查看语法错误等,如遗漏分号等;

2)在实例化期间,检查模板代码,查看是不是所有的调用都有效。如该实例化类型不支持某些函数的调用。

3.显示指定模板参数

模板参数不支持自动类型转换,每个T都必须准确的匹配。

template <typename T>
inline T const7 max(T const& a, T cosnt& b);
...
max(4,7) //OK
max(4,4.2) //ERROR,第一个是int,第二个是double
有几种解决办法,
1)max(static_cast(double)(4),4.2)   //OK
2)显示指定模板参数:
max<double>(4,4.2)
3)使用连个模板参数。
 

4.重载函数模板

和普通函数一样,模板函数同样可以被重载,相同的函数名称可以具有不同的函数定义。

几条基本的原则:

1)非模板函数和一个同名的模板函数可以同时存在。对于非模板函数和同名的函数模板,如果其他条件都相同的话,在调用的时候将调用非模板函数,不会实例化模板函数。

2)如果模板产生一个更好的匹配,选择模板参数。

3)可以显示的指定一个空的模板实例列表,告诉编译器,用模板来匹配。

4)函数的所有重载说明在该函数被调用位置之前。

我现在的感觉是这个功能少用,很容易出问题,以后就不知道了。

C++ 类模板的使用的更多相关文章

  1. C++STL - 类模板

    类的成员变量,成员函数,成员类型,以及基类中如果包含参数化的类型,那么该类就是一个类模板   1.定义 template<typename 类型形参1, typename 类型形参2,...&g ...

  2. Xcode6中如何使用自定义的类模板

    说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...

  3. VS2013,VS2015设置类模板文件表头

    一般VS的类模板文件是放在C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSha ...

  4. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

  5. 类模板的static成员

    下列代码可以通过编译吗?如何修改使其通过编译? template <class T> struct sum {   static void foo(T op1 , T op2){    c ...

  6. 4.1 pair类模板

    在学习关联容器之前,首先先要了解一下STL中的pair类模板,因为关联容器的一些成员函数返回值都是pair对象,而且map 和multimap中的元素都是pair对象. 1)pair类模板定义 pai ...

  7. 3.2 STL中的函数对象类模板

    *: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...

  8. C++类模板

    在上篇文章(C++函数模板)中,主要介绍了C++中函数模板,与函数相似,类也可以被一种或多种类型参数化.容器类就是一个具有这种特性的典型的例子, 本文地址:http://www.cnblogs.com ...

  9. [Reprint] C++函数模板与类模板实例解析

    这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下   本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...

随机推荐

  1. 《与小卡特一起学Python》 Code2

    下边是一个猜数字的小游戏: 几乎所有语言都这样做的…… here we go! import random secret = random.randint(1,99) guess = 0 tries ...

  2. Bean熟悉替换,只替换部分属性,其他属性值不改变

    Bean熟悉替换,只替换部分属性,其他属性值不改变 需要加入:asm.jar  cglib-2.1.jar,用来map和bean之间的转换(比spring和反射的效率好,因为加入了缓存) packag ...

  3. servlet获取表单数据的方式和编码方式

    .在servlet中获取表单的数据的几种方式  1>request.getParameter(“name”)://获取指定名称的值,返回值类型是一个字符串  2>request.getPa ...

  4. Nginx基础知识之————RTMP模块专题(实践文档)

    on_publish 语法:on_publish url上下文:rtmp, server, application描述:这个可以设置为一个API接口(GET方式接受所有参数),会给这个API接口返回8 ...

  5. G将军的敢死队——树状DP

    当前节点的两种情况: 1.beChoosed = {son.beAbandoned乘积} //当前节点选中的情况下,子节点都不能选 2.beAbandoned = {(son.beAbandoned ...

  6. 尝试用md编辑器写博客, 内容为 jupyter笔记

    Matplotlib tutorial http://www.labri.fr/perso/nrougier/teaching/matplotlib/#introduction %matplotlib ...

  7. ~/.config/user-dirs.dirs【桌面设置】

    # This file is written by xdg-user-dirs-update # If you want to change or add directories, just edit ...

  8. Redis教程(二):String数据类型

    一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...

  9. kali 安装FTP服务器-vsftpd

    参考文章:Ubuntu 14.04 FTP服务器--vsftpd的安装和配置 本文将会介绍在kali2.0上安装vsftpd,主要分成四块:更新源列表.安装和配置vsftpd服务器.使用ftp命令传输 ...

  10. 学习_单片机/嵌入式_的资源链接。——Arvin

    ---恢复内容开始--- +单片机 -郭天祥的51单片机入门视频(链接: https://pan.baidu.com/s/1sl3xNDr 密码: 1zik) -51单片机20元购买资料公开(链接: ...