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
肥仔
閱讀(562)
評論(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
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 肥仔
導航
C++博客
首頁
新隨筆
聯系
聚合
管理
<
2008年6月
>
日
一
二
三
四
五
六
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開發者指南(72264)
2.?怎樣在Word里面將字體背景顏色去掉?(56389)
3.?如何使用Office2003來打開Docx、xlsb、xlsx等文件(40986)
4.?vc中調用Com組件的方法詳解(39530)
5.?visual studio 2008 試用版評估期已結束的解決方法(39229)
6.?gSOAP中文文檔(34475)
7.?C函數中,可變長參數的傳遞?(32281)
8.?Bison-Flex 筆記(24657)
9.?膝蓋過勞損傷----詳細分類圖片(特優文章)(23566)
10.?使用zlib壓縮解壓縮文件的詳細過程(22956)
11.?有限狀態機時代終結的10大理由(20907)
12.?利用VS2005進行dump文件調試(20765)
13.?現在市面上的正紅花油到底哪個是最老的牌子?(19225)
14.?衣服洗完以后還有一種臭汗味,如何處里?(19089)
15.?PowerDesigner教程系列(18281)
16.?局域網通過ip查看對方計算機名,通過計算機名查看對方ip(18233)
17.?詞法分析(NFA與DFA)(18088)
18.?windows中添加PATH環境變量(17965)
19.?zlib用法簡單說明(17170)
20.?草木瓜----Lex和Yacc教程(16719)
21.?malloc,new,VirtualAlloc,HeapAlloc性能(速度)比較(15929)
22.?MYSQL查詢某一個字段為空或者不為空(15890)
23.?Java連接mysql數據庫攻略(15782)
24.?用Visio畫UML圖 類結構圖(基本篇)(14789)
25.?用Visio畫UML圖 基本操作(13716)
26.?使用Flex Bison 和LLVM編寫自己的編譯器(13381)
27.?膝蓋解剖圖(12418)
28.?Word項目符號和編號對齊的問題(12392)
29.?Keep-Alive: timeout=5, max=100(12234)
30.?Zlib函數列表和使用手冊(11739)
31.?用Visio畫UML圖 類結構圖(進階篇)(11365)
32.?java enum無法賦初始值(11099)
33.?MySql數據庫--mysql_real_escape_string()函數(11003)
34.?字符串匹配算法(10901)
35.?zlib使用defalte, gzip的例子(10456)
36.?如何在vc中更改棧空間的大小(10280)
37.?使用MiniDumpWriteDump API 來生成程序的Dump(10187)
38.?詞法分析器生成工具FLEX簡介(10120)
39.?HTTP/1.1協議規范(中文歸納版)(10092)
40.?享譽盛名的12分鐘跑以及相關成績(10002)
評論排行榜
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)
亚洲午夜久久久
|
国产精品久久久天天影视香蕉
|
久久精品国产WWW456C0M
|
久久久久亚洲av毛片大
|
久久国产免费直播
|
国产精品久久久久久
|
亚洲国产精品久久久久婷婷软件
|
久久久久18
|
亚洲女久久久噜噜噜熟女
|
99久久精品费精品国产一区二区
|
久久久久久精品免费看SSS
|
少妇久久久久久被弄高潮
|
精品久久久久国产免费
|
亚洲精品美女久久久久99
|
久久久久久国产精品免费免费
|
久久久久久久久无码精品亚洲日韩
|
亚洲?V乱码久久精品蜜桃
|
91久久精品91久久性色
|
久久精品国产清自在天天线
|
久久无码av三级
|
久久久噜噜噜久久中文福利
|
欧美黑人激情性久久
|
久久国产精品免费
|
国产精品女同一区二区久久
|
91精品国产色综合久久
|
久久精品一区二区三区AV
|
色婷婷久久久SWAG精品
|
国产福利电影一区二区三区久久久久成人精品综合
|
久久精品国产91久久麻豆自制
|
久久久久av无码免费网
|
麻豆久久久9性大片
|
yellow中文字幕久久网
|
日本精品久久久中文字幕
|
久久久女人与动物群交毛片
|
国产精品午夜久久
|
91精品婷婷国产综合久久
|
久久久91精品国产一区二区三区
|
日产精品久久久一区二区
|
一本一本久久A久久综合精品
|
久久久精品国产
|
久久精品中文无码资源站
|