woaidongmao
文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……
C++模版使用技巧--Int2Type
一 Int2Type
平常我们所看到的int是一个类型,例如1,2,3...等属于int。 但是这里说的是通过模版使每一个int类型变量都当成是不同的类型。
二 C++模版的迟绑定
这个名字是我起的,因为不知道正式的称呼是什么,意思是说在使用C++的模版的时候,只有在你的代码里面调用了某个模版方法,在编译的时候才会产生对应的方法,也即编译后的代码中不包含我们没有使用的模版方法。看下面的实例是可以编译运行的:
class
X
{
public
:
void
f()
{}
}
;
class
Y
{
public
:
void
g()
{}
}
;
template
<
typename T
>
class
Z
{
T t;
public
:
void
a()
{ t.f(); }
void
b()
{ t.g(); }
}
;
int
main()
{
Z
<
X
>
zx;
zx.a();
//
Doesn't create Z<X>::b()
Z
<
Y
>
zy;
zy.b();
//
Doesn't create Z<Y>::a()
}
/**/
///
:~
三 问题
template
<
typename T,
bool
isPolymorphic
>
class
NiftyContainer
{
void
DoSomething()
{
T
*
pSomeObj
=
;
if
(isPolymorphic)
{
T
*
pNewObj
=
pSomeObj
->
Clone();
}
else
{
T
*
pNewObj
=
new
T(
*
pSomeObj);
}
}
}
;
class
Test
{
public
:
Test()
{}
;
}
;
void
main()
{
NiftyContainer
<
Test,
true
>
test;
//
test.DoSomething();
//
这里通不过编译
}
大家也许会说上面的方法代码没有问题,我说,有问题,仔细看一开始的代码和我的说明,我说的是只要我们的代码里面用到模版方法就会被编译为目标代码,而不是说在代码运行的时候使用到的代码才会被编译为目标代码,好的,搞清楚了这个就可以知道上面的实例为什么通不过编译了。
四 Int2Type
下面正式进入主题Int2Type的作用和使用,上面的实例,我们传入的T类型中只有clone或public构造函数中的一个,我们想根据bool值来选择使用clone或new,但是上面的代码有问题,编译都不过偶,下面使用Int2Type来实现:
template
<
int
v
>
struct
Int2Type
{
enum
{ value
=
v }
;
}
;
template
<
typename T,
bool
isPolymorphic
>
class
NiftyContainer
{
private
:
void
DoSomething(T
*
pObj, Int2Type
<
true
>
)
{
T
*
pNewObj
=
pObj
->
Clone();
}
void
DoSomething(T
*
pObj, Int2Type
<
false
>
)
{
T
*
pNewObj
=
new
T(
*
pObj);
}
public
:
void
DoSomething(T
*
pObj)
{
DoSomething(pObj, Int2Type
<
isPolymorphic
>
());
}
}
;
class
Test
{
public
:
Test()
{}
;
}
;
void
main()
{
NiftyContainer
<
Test,
false
>
test;
//
如果用ture不会通过编译
Test
*
t
=
new
Test();
test.DoSomething(t);
}
看了上面的代码,我不禁要再次的赞叹《C++设计新思维》的作者,高!
posted on 2008-09-14 17:54
肥仔
阅读(547)
评论(0)
编辑
收藏
引用
所属分类:
C++ 模板
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
模板导致的代码膨胀问题和解决
模版函数特化版本放在前面,错误(VC6)
VC6不支持的模板特性
成员函数指针与高性能的C++委托(Fastest Possible C++ Delegates)
模版函数指针,C++委托的实现
VC++ 6.0的小花招
STL中迭代器traits技巧学习 : 一个简单的测试程序
Traits: 类型的else-if-then机制
Generic:Traits on Steroids
traits:Traits技术初探
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 肥仔
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2012年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(10)
给我留言
查看公开留言
查看私人留言
随笔分类
Boost & STL (37)
(rss)
C++ 基础(181)
(rss)
C++ 模板(48)
(rss)
COM(12)
(rss)
Flash & Flex(3)
(rss)
HTTP & URL(24)
(rss)
IDC & 服务器DIY(4)
(rss)
LEX & YACC(41)
(rss)
Linux(1)
(rss)
MFC存档(30)
(rss)
OOP(8)
(rss)
UML(4)
(rss)
VC 存档(45)
(rss)
Web Rss(4)
(rss)
Web-后台(157)
(rss)
Web-前台(32)
(rss)
Win32 Bat(1)
(rss)
Windows开发(91)
(rss)
XML(5)
(rss)
编程思想(96)
(rss)
调试(17)
(rss)
工具(22)
(rss)
脚本语言(10)
(rss)
开车(46)
(rss)
库 & 代码段(16)
(rss)
模板引擎(8)
(rss)
其他经验(30)
(rss)
设计模式(4)
(rss)
设计图例(6)
(rss)
生活——常识(31)
(rss)
生活——导购(15)
(rss)
生活——健康(118)
(rss)
生活——运动(30)
(rss)
生活——自行车(2)
(rss)
数据结构 & 算法(2)
(rss)
数据库(97)
(rss)
网络编程(59)
(rss)
压缩 & 解压(9)
(rss)
正则表达式(6)
(rss)
转型——创业 & 立业(46)
(rss)
转型——经济 & 金融(8)
(rss)
转型——投资 & 理财
(rss)
状态机 & 自动机 & 形式语言(56)
(rss)
字符编码(16)
(rss)
随笔档案
2014年4月 (1)
2013年4月 (1)
2013年3月 (1)
2012年9月 (4)
2012年7月 (4)
2012年6月 (10)
2012年5月 (4)
2012年4月 (19)
2012年3月 (24)
2012年2月 (2)
2012年1月 (3)
2011年12月 (1)
2011年11月 (2)
2011年10月 (2)
2011年9月 (13)
2011年8月 (40)
2011年7月 (31)
2011年6月 (22)
2011年5月 (25)
2011年4月 (21)
2011年3月 (20)
2011年2月 (11)
2011年1月 (13)
2010年12月 (9)
2010年9月 (3)
2010年8月 (3)
2010年7月 (10)
2010年6月 (2)
2010年5月 (9)
2010年4月 (3)
2010年3月 (20)
2010年2月 (12)
2010年1月 (4)
2009年12月 (9)
2009年11月 (19)
2009年10月 (38)
2009年9月 (64)
2009年8月 (116)
2009年7月 (47)
2009年6月 (121)
2009年5月 (14)
2009年4月 (10)
2009年3月 (59)
2009年2月 (15)
2009年1月 (24)
2008年12月 (57)
2008年11月 (84)
2008年10月 (60)
2008年9月 (97)
2008年8月 (52)
2008年7月 (26)
2008年6月 (59)
2008年5月 (112)
2008年4月 (35)
2008年1月 (2)
搜索
最新评论
1. re: 利用VS2005进行dump文件调试
不错,工具是什么、怎么用清楚了,程序调试、查错非常有用
--黄华仔
2. re: COM 类工厂有必要存在吗?
评论内容较长,点击标题查看
--天空之城
3. re: 改动和维护一份代码的多个版本将使人心力憔悴[未登录]
123
--123
4. re: MySql数据库--mysql_real_escape_string()函数
ert
--wewe\'4545
5. re: 使用std::vector 的陷阱
评论内容较长,点击标题查看
-- klinik apotik24
6. re: 使用std::vector 的陷阱
评论内容较长,点击标题查看
--Dr.Aborsi Kandungan
7. re: 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)[未登录]
求问怎么优化的
--hunter
8. re: 浅谈URL最后带斜杠对SEO优化的影响
不错
--第三方
9. re: 大文件内数据排序问题:采用文件映射内存技术
あなたの教授が望んでいた紙を提供することができるので、あなたが期限と提出の期日を心配する必要はありません
--best-custom-essays.com
10. re: 大文件内数据排序问题:采用文件映射内存技术
は!この記事では、はるかに良い書き込むことができませんると、私の以前のルームメイトのことをでした!
--Essays-shark.net
11. re: 有限状态机时代终结的10大理由
技术终会发展,但也用不着扯淡吧。
--ywx
12. re: traits:Traits技术初探
示例不能运行啊
--lzq
13. re: 使用std::vector 的陷阱
如果有引用记数的话,如智能指针, 就不会被释放掉了。不过如果一般编码里面不需要用到引用记数的话,还是方法1比较简便
--Obat Penggugur Kandungan
14. re: 使用std::vector 的陷阱
容器只有责任维护你给他的东西,但没理由维护这个东西里面的东西。不仅仅是vector,STL所有的容器如果按你这种思维去用
--Cara Menggugurkan Kandungan
15. re: C++中派生类对基类成员的三种访问规则
@lan
确实不可以,只有在派生类成员函数中(内部访问)才可以访问。
--walzzz
16. re: 使用std::vector 的陷阱
私のような初心者のための読書の多くを必要とし、様々なブログ上の情報を検索します。あなたはとても素敵を共有し、私を鼓舞し、記事
--cara menggugurkan kandungan
17. re: 分层有限状态机HFSM\行为树BEHAVIOR TREE和FSM
那个链接的帖子没了,可以给一个学习下吗,
2520079@qq.com
--屌丝策划一枚
18. re: 使用std::vector 的陷阱
この記事では、読者のために非常に良いと便利です。知識の共有をありがとうございました
--obat penggugur kandungan
19. re: 判断字符串是否UTF8编码
有问题,输入 GBK的 “蓝色” ,判断的结果是utf-8编码。
--ddd
20. re: visual studio 2008 试用版评估期已结束的解决方法
大谢,有的人没有这个框的。@lizongqi
--WU
21. re: 判断字符串是否UTF8编码
试一下输入gbk码的“联通”二字,发现判断的结果是utf-8编码,所以该判断函数存在问题
--liuyuananfang
22. re: 浅谈URL最后带斜杠对SEO优化的影响[未登录]
转载请说明,连个原文地址也没有,素质!
--无名
23. re: 模板导致的代码膨胀问题和解决
评论内容较长,点击标题查看
--myanbu
24. re: 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
评论内容较长,点击标题查看
--ngugc
25. re: visual studio 2008 试用版评估期已结束的解决方法
评论内容较长,点击标题查看
--费瓦湖
26. re: 使用std::vector 的陷阱
评论内容较长,点击标题查看
--judi bola
27. re: 词法分析器生成工具FLEX简介[未登录]
yywrap()函数果真一定要用户提供吗?我自己写的例子就没有提供,照样运行的好好的。
--路人甲
28. re: C函数中,可变长参数的传递?
大爱楼主
--花雨
29. re: MYSQL查询某一个字段为空或者不为空[未登录]
123123123
--123
30. re: 关于FlushViewOfFile的问题
感觉我的东西并没有写入磁盘为什么你
--jjj
31. re: malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较
new 或 malloc调用heapalloc,heapalloc调用virtualalloc。底层速度更快。
如果你显示的结果慢,那是因为你使用方式不符合相对应的API特点而已。
--看到了
32. re: 利用GoAhead构建嵌入式web应用
收录却不附上链接地址,有点过了,学这行基本的版权意识都没有
--fsa
33. re: 大文件内数据排序问题:采用文件映射内存技术
评论内容较长,点击标题查看
--http://www.tvslakshmischool.org/
34. re: Dissect Eclipse Plugin Framework
评论内容较长,点击标题查看
--IT技术网站
35. re: PowerDesigner教程系列
评论内容较长,点击标题查看
--IT技术网站
36. re: 使用zlib压缩解压缩文件的详细过程
我只能参考前5行
--Fack
37. re: visual studio 2008 试用版评估期已结束的解决方法
真的很好用。补丁特别给力!方法也是对的。两个方法要结合到一起来用。
--Lueyhong Wu
38. re: 用汇编实现原子操作
评论内容较长,点击标题查看
--wd
39. re: 代码自动生成工具MyGeneration之一,二,三
这个不是原创的吧....
--原创者
40. re: 使用std::vector 的陷阱
但没理由维护这个东西里面的东西。所有的容器如果按你这种思维去用,则应该存储该数据
--agen bola terpercaya
阅读排行榜
1. google ProtoBuf开发者指南(72210)
2. 怎样在Word里面将字体背景颜色去掉?(56339)
3. 如何使用Office2003来打开Docx、xlsb、xlsx等文件(40938)
4. vc中调用Com组件的方法详解(39443)
5. visual studio 2008 试用版评估期已结束的解决方法(39116)
6. gSOAP中文文档(34395)
7. C函数中,可变长参数的传递?(31967)
8. Bison-Flex 笔记(24595)
9. 膝盖过劳损伤----详细分类图片(特优文章)(23538)
10. 使用zlib压缩解压缩文件的详细过程(22899)
11. 有限状态机时代终结的10大理由(20829)
12. 利用VS2005进行dump文件调试(20650)
13. 现在市面上的正红花油到底哪个是最老的牌子?(19116)
14. 衣服洗完以后还有一种臭汗味,如何处里?(19043)
15. PowerDesigner教程系列(18256)
16. 局域网通过ip查看对方计算机名,通过计算机名查看对方ip(18200)
17. 词法分析(NFA与DFA)(18013)
18. windows中添加PATH环境变量(17907)
19. zlib用法简单说明(17105)
20. 草木瓜----Lex和Yacc教程(16635)
21. MYSQL查询某一个字段为空或者不为空(15875)
22. malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较(15804)
23. Java连接mysql数据库攻略(15766)
24. 用Visio画UML图 类结构图(基本篇)(14748)
25. 用Visio画UML图 基本操作(13692)
26. 使用Flex Bison 和LLVM编写自己的编译器(13327)
27. 膝盖解剖图(12386)
28. Word项目符号和编号对齐的问题(12359)
29. Keep-Alive: timeout=5, max=100(12197)
30. Zlib函数列表和使用手册(11654)
31. 用Visio画UML图 类结构图(进阶篇)(11290)
32. java enum无法赋初始值(11084)
33. MySql数据库--mysql_real_escape_string()函数(10940)
34. 字符串匹配算法(10857)
35. zlib使用defalte, gzip的例子(10377)
36. 如何在vc中更改栈空间的大小(10189)
37. 使用MiniDumpWriteDump API 来生成程序的Dump(10108)
38. HTTP/1.1协议规范(中文归纳版)(10066)
39. 词法分析器生成工具FLEX简介(10057)
40. 享誉盛名的12分钟跑以及相关成绩(9932)
评论排行榜
1. visual studio 2008 试用版评估期已结束的解决方法(58)
2. 使用std::vector 的陷阱(30)
3. 40 个轻量级 JavaScript 库(17)
4. SIZEOF宏,弥补sizeof不足(17)
5. 正则表达式30分钟入门教程(16)
6. EXT_ASSERT将ASSERT与if结合在一起(15)
7. static 变量初始化顺序引发的bug(14)
8. Some of the best Open Source Project's in VC++ & MFC(14)
9. malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较(14)
10. 去掉PowerDesigner 15 在 Visual Studio 2008里的不兼容(13)
11. Flex与JSON及XML的互操作(12)
12. 猜猜看,id变成9了吗?(10)
13. 使用zlib压缩解压缩文件的详细过程(9)
14. VC9 用VC6的老字体 [VS2008 + Visual assister 1647的搭配蛮好](9)
15. VC OCX 打包CAB 网页发布全过程记录(8)
16. ZeroMQ 汇总(8)
17. 使用Flex Bison 和LLVM编写自己的编译器(7)
18. 跟腱炎----病友交流(7)
19. 膝盖过劳损伤----详细分类图片(特优文章)(7)
20. Ragel State Machine Compiler 的速度测试(7)
21. 聪明反被聪明误,一个bug(7)
22. 用Lex和Yacc做一个简单的SQL解释器(7)
23. yacc/lex windows 下 Parser Generator 使用指南(6)
24. 64位开发中去除64位平台的内存错误方法(6)
25. EmEditor编辑器帮助你批量替换文件名(6)
26. google ProtoBuf开发者指南(6)
27. C++ 标准库中的 allocator 是多余的(5)
28. 大文件内数据排序问题:采用文件映射内存技术(5)
29. 浅层数据结构(结构型)vs 深层数据结构(聚合型)(5)
30. 怎样在Word里面将字体背景颜色去掉?(5)
31. 云计算,炒作(5)
32. larbin结构分析(5)
33. 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)(5)
34. Virtual / 虚函数之一、二、三、四......(5)
35. SOS, 请教:XML和struct之间相互转换的问题(5)
36. 美利达公爵 vs ATX740(4)
37. RSS利于发布什么样的内容(4)
38. 开区间与闭区间——从初等数学中吸取一点编程养分(4)
39. 词法分析(NFA与DFA)(4)
40. Nokia免费GPS导航 ovi地图 s60v5多语言(自带中文)完全版(4)