woaidongmao
文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……
关于模板的类型参数
看了cpunion写的IDL的代码,我知道了这样的用法:
在模板参数中,类型参数可以这样构造:
template_class< type( type1, type2, ... ) > a_class;
比如,可以void( void ), void(), void( int ), 也可以int( void ), string( int )等等,编译器是将它们当作不同的类型的来处理的.对此,我写了一些代码作了一下测试(见文末).但我也仅仅是有一个感性的认识而已,对于其为什么可以这样(因为从未见哪本书上介绍过这样的用法),我一点也不知道.
希望大家帮我释疑,也希望cpunion来帮我一下,谢谢!
#include
<
iostream
>
typedef
void
(
*
fun)(
int
);
using
namespace
std;
template
<
typename
T
>
struct
Base
{
void
test()
{
cout
<<
"
Base
"
<<
"
\t=\t
"
;
cout
<<
"
Base<
"
<<
typeid
(T).name()
<<
"
>
"
<<
endl;
}
}
;
template
<>
struct
Base
<
void
>
{
void
test()
{
cout
<<
"
Base
"
<<
endl;
}
}
;
template
<>
struct
Base
<
void
(
int
)
>
{
void
test()
{
cout
<<
"
Base
"
<<
endl;
}
}
;
template
<>
struct
Base
<
fun
>
{
void
test()
{
cout
<<
"
Base
"
<<
endl;
}
}
;
template
<>
struct
Base
<
int
(
string
,
int
,
char
)
>
{
void
test()
{
cout
<<
"
Base
"
<<
endl;
}
}
;
int
main(
int
argc,
char
*
argv[])
{
Base
<
void
>
b_void;
Base
<
void
(
int
)
>
b_void_int;
b_void.test();
b_void_int.test();
Base
<
int
(
string
,
int
,
char
)
>
b_int;
Base
<
fun
>
b_fun;
b_int.test();
b_fun.test();
Base
<
Base
<
void
>
( Base
<
int
(
string
,
int
,
char
)
>
)
>
b_complex;
b_complex.test();
return
0
;
}
posted on 2005-09-29 19:51
可冰
阅读(757)
评论(9)
编辑
收藏
引用
所属分类:
C++
评论
#
re: 关于模板的类型参数
2005-09-29 21:16
cpunion
模板的类型参数,只要是类型都是可以接受的。
template <class T>
class Base
{
};
定义了一个类模板,后面都是它的偏特化。
你的疑问应该是void(*)(int)类型和void(int)类型的区别吧?
void(int)是一个函数类型,void(*)(int)是一个函数指针类型,函数类型仅在声明时有效,当把void(int)类型的函数作为一个值来传递时,它自动退化为void(*)(int)指针类型。
关于这一点,最好是看刘未鹏对于boost::function源代码的解释,我也是从这里才知道有这种用法的。
回复
更多评论
#
re: 关于模板的类型参数
2005-09-29 21:23
函数类型
void Fun(int);
cout << typeid(void(int)).name() << endl;
cout << typeid(Fun).name() << endl;
回复
更多评论
#
re: 关于模板的类型参数
2005-09-29 21:39
cpunion
typeid, sizeof, typeof(c++0x)都不取表达式的值,只提取类型。
回复
更多评论
#
re: 关于模板的类型参数
2005-09-29 22:57
可冰
void(int)原来是函数类型啊!从来没有见到过这样的类型啊.
你所说的"当把void(int)类型的函数作为一个值来传递时,它自动退化为void(*)(int)指针类型。"应该是指,用它来定义变量的时候,这个变量就成了函数指针类型的了?
回复
更多评论
#
re: 关于模板的类型参数
2005-09-29 23:08
cpunion
函数类型可以用做声明,也可以表示函数代码块,不能直接用它声明一个变量,所以很少见。
比如函数:
void func(int)
{
}
func本身是函数类型,不过当作值来传递给一个void(*)(int)类型指针时,自动退化为指针类型,所以不需要加上&符号,加上&也是合法的。
使用typeid, typeof都可以获取到函数类型。
回复
更多评论
#
re: 关于模板的类型参数
2005-09-29 23:11
可冰
我在模板中试了一下,确实用函数类型定义的变量成为了函数指针类型.
定义为: T var;
输出为: var: void (__thiscall Base<void __cdecl(int)>::*)(int)
T : void __cdecl(int)
但是在外部,定义这样的一个类型及变量:
typedef void MethodType (int);
MethodType method;
它们的类型居然是一样的,method在这儿并没有转化为函数指针类型.
输出类型如下:
void __cdecl(int)
void __cdecl(int)
这又是怎么回事?
回复
更多评论
#
re: 关于模板的类型参数
2005-09-29 23:40
cpunion
在g++编译器下,T var;是不能编译通过的。
typedef void MethodType (int);
MethodType method;
这个定义确实能够通过编译(我以前没这么测试过),因为method的是函数类型,而它没有实际定义,相当于写了一个函数声明,所以如果调用它,链接器将报错。
这个功能本来是开放给编译器使用的,所以虽然能够定义,但无法操作它,你无法对它使用sizeof,无法对它取地址,只能对它使用typeid获取类型信息、使用typeof获取它的类型。
int m;
typedef void MethodType (int);
MethodType method;
int n;
测试可以知道,n和m的地址相差是4字节(32位平台上),method并不真的定义了一个变量。
应该是C++给编译器定的标准,相当诡异。。
回复
更多评论
#
re: 关于模板的类型参数
2005-09-30 01:59
说得对,仅仅是申明
typedef void MethodType (int);
MethodType method;
和
extern void method(int);
基本上一样,另外,加上定义
void method(int)
{
}
可以
method(0);
这样用了
回复
更多评论
#
re: 关于模板的类型参数
2005-09-30 20:51
可冰
[摘录]Boost源码剖析之:泛型函数指针类boost::function(修订版)
刘未鹏 /文
或许你会对模板参数int(int)感到陌生,其实它是个函数型别——函数g的确切型别就是int(int),而我们通常所看到的函数指针型别int (*)(int)则是&g的型别。它们的区别与联系在于:当把g作为一个值进行拷贝的时候(例如,按值传参),其类型就会由int(int)退化为int(*)(int),即从函数类型退化为函数指针类型——因为从语义上说,函数不能被“按值拷贝”,但身为函数指针的地址值则是可以被拷贝的。另一方面,如果g被绑定到引用,则其类型不会退化,仍保持函数类型。
......
请注意,函数类型乃是个极其特殊的类型,在大多数时候它都会退化为函数指针类型,以便满足拷贝语义,只有面对引用绑定的时候,能够维持原来的类型。当然,对于boost::function,总是按值拷贝。
回复
更多评论
posted on 2008-08-31 21:55
肥仔
阅读(538)
评论(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++博客
首页
新随笔
联系
聚合
管理
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
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
31
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(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)