C++/CLR泛型與C++模板的對(duì)比
發(fā)布時(shí)間:2008/8/23 0:00:00 訪問(wèn)次數(shù):475
參數(shù)列表
參數(shù)列表與函數(shù)的信號(hào)(signature)類似:它標(biāo)明了參數(shù)的數(shù)量和每個(gè)參數(shù)的類型,并把給每個(gè)參數(shù)關(guān)聯(lián)一個(gè)唯一的標(biāo)識(shí)符,這樣在模板定義的內(nèi)部,每個(gè)參數(shù)就可以被唯一地引用。
參數(shù)在模板或泛型的定義中起占位符(placeholder)的作用。用戶通過(guò)提供綁定到參數(shù)的實(shí)際值來(lái)建立對(duì)象實(shí)例。參數(shù)化類型的實(shí)例化并非簡(jiǎn)單的文本替代(宏擴(kuò)展機(jī)制就是使用文本替代的)。相反地,它把實(shí)際的用戶值綁定到定義中的相關(guān)的形式參數(shù)上。
在泛型中,每個(gè)參數(shù)都表現(xiàn)為object類型或衍生自object的類型。在本文后面你可以看到,這約束了你可能執(zhí)行的操作類型或通過(guò)類型參數(shù)聲明的對(duì)象。你可以通過(guò)提供更加明確的約束來(lái)調(diào)整這些約束關(guān)系。這些明確的約束引用那些衍生出實(shí)際類型參數(shù)的基類或接口集合。
模板除了支持類型參數(shù)之外,還支持表達(dá)式和模板參數(shù)。此外,模板還支持默認(rèn)的參數(shù)值。這些都是按照位置而不是名稱來(lái)分解的。在兩種機(jī)制之下,類型參數(shù)都是與類或類型名稱關(guān)鍵字一起引入的。
參數(shù)列表的額外的模板功能
模板作為類型參數(shù)的補(bǔ)充,允許兩種類型的參數(shù):非類型(non-type)參數(shù)和模板參數(shù)。我們將分別簡(jiǎn)短地介紹一下。
非類型參數(shù)受常數(shù)表達(dá)式的約束。我們應(yīng)該立即想到它是數(shù)值型或字符串常量。例如,如果選擇提供固定大小的堆棧,你就可能同時(shí)指定一個(gè)非類型的大小參數(shù)和元素類型參數(shù),這樣就可以同時(shí)按照元素類別和大小來(lái)劃分堆棧實(shí)例的類別。例如,你可以在代碼片斷1中看到帶有非類型參數(shù)的固定大小的堆棧。
代碼片斷1:帶有非類型固定大小的堆棧
template <class elemtype, int size>
public ref class tstack
{
array<elemtype> ^m_stack;
int top;
public:
tstack() : top( 0 )
{
m_stack = gcnew array<elemtype>( size );
}
};
// 帶有默認(rèn)值的模板聲明
template <class elemtype, int size = 1024>
public ref class fixedsizestack {};
// 最多128個(gè)字符串實(shí)例的堆棧
fixedsizestate<string^, 128> ^tbs = gcnew fixedsizestack<string^, 128>;
// 最多1024個(gè)字符串實(shí)例的堆棧
fixedsizestack<string^> ^tbs = gcnew fixedsizestack<string^>;
{
template <class t, class container = deque<t> >
class queue;
template <class t, class allocator = allocator<t> >
class vector;
// ...
} 也可以提供默認(rèn)的元素類型,如下所示:
// 帶有默認(rèn)的元素類型的模板聲明
template <class elemtype=string^, int size=1024>
public ref class tstack {};
指針也可以作為非類型參數(shù),因?yàn)閷?duì)象或函數(shù)的地址在編譯時(shí)就已知了,因此是一個(gè)常量表達(dá)式。例如,你可能希望為堆棧類提供第三個(gè)參數(shù),這個(gè)參數(shù)指明遇到特定條件的時(shí)候使用的回調(diào)處理程序。明智地使用typedef可以大幅度簡(jiǎn)化那些表面上看起來(lái)很復(fù)雜的聲明,如下所示:
typedef void (*handler)( ... array<o(jì)bject^>^ );
template <class elemtype, int size, handler cback >
public ref class tstack {};
void defaulthandler( ... array<o(jì)bject^>^ ){ ... }
template < class elemtype,
int size = 1024,
handler cback = &defaulthandler >
public ref class tstack {};
void demonstration()
{
// 默認(rèn)的大小和處理程序
tstack<string^> ^ts1
參數(shù)列表
參數(shù)列表與函數(shù)的信號(hào)(signature)類似:它標(biāo)明了參數(shù)的數(shù)量和每個(gè)參數(shù)的類型,并把給每個(gè)參數(shù)關(guān)聯(lián)一個(gè)唯一的標(biāo)識(shí)符,這樣在模板定義的內(nèi)部,每個(gè)參數(shù)就可以被唯一地引用。
參數(shù)在模板或泛型的定義中起占位符(placeholder)的作用。用戶通過(guò)提供綁定到參數(shù)的實(shí)際值來(lái)建立對(duì)象實(shí)例。參數(shù)化類型的實(shí)例化并非簡(jiǎn)單的文本替代(宏擴(kuò)展機(jī)制就是使用文本替代的)。相反地,它把實(shí)際的用戶值綁定到定義中的相關(guān)的形式參數(shù)上。
在泛型中,每個(gè)參數(shù)都表現(xiàn)為object類型或衍生自object的類型。在本文后面你可以看到,這約束了你可能執(zhí)行的操作類型或通過(guò)類型參數(shù)聲明的對(duì)象。你可以通過(guò)提供更加明確的約束來(lái)調(diào)整這些約束關(guān)系。這些明確的約束引用那些衍生出實(shí)際類型參數(shù)的基類或接口集合。
模板除了支持類型參數(shù)之外,還支持表達(dá)式和模板參數(shù)。此外,模板還支持默認(rèn)的參數(shù)值。這些都是按照位置而不是名稱來(lái)分解的。在兩種機(jī)制之下,類型參數(shù)都是與類或類型名稱關(guān)鍵字一起引入的。
參數(shù)列表的額外的模板功能
模板作為類型參數(shù)的補(bǔ)充,允許兩種類型的參數(shù):非類型(non-type)參數(shù)和模板參數(shù)。我們將分別簡(jiǎn)短地介紹一下。
非類型參數(shù)受常數(shù)表達(dá)式的約束。我們應(yīng)該立即想到它是數(shù)值型或字符串常量。例如,如果選擇提供固定大小的堆棧,你就可能同時(shí)指定一個(gè)非類型的大小參數(shù)和元素類型參數(shù),這樣就可以同時(shí)按照元素類別和大小來(lái)劃分堆棧實(shí)例的類別。例如,你可以在代碼片斷1中看到帶有非類型參數(shù)的固定大小的堆棧。
代碼片斷1:帶有非類型固定大小的堆棧
template <class elemtype, int size>
public ref class tstack
{
array<elemtype> ^m_stack;
int top;
public:
tstack() : top( 0 )
{
m_stack = gcnew array<elemtype>( size );
}
};
// 帶有默認(rèn)值的模板聲明
template <class elemtype, int size = 1024>
public ref class fixedsizestack {};
// 最多128個(gè)字符串實(shí)例的堆棧
fixedsizestate<string^, 128> ^tbs = gcnew fixedsizestack<string^, 128>;
// 最多1024個(gè)字符串實(shí)例的堆棧
fixedsizestack<string^> ^tbs = gcnew fixedsizestack<string^>;
{
template <class t, class container = deque<t> >
class queue;
template <class t, class allocator = allocator<t> >
class vector;
// ...
} 也可以提供默認(rèn)的元素類型,如下所示:
// 帶有默認(rèn)的元素類型的模板聲明
template <class elemtype=string^, int size=1024>
public ref class tstack {};
指針也可以作為非類型參數(shù),因?yàn)閷?duì)象或函數(shù)的地址在編譯時(shí)就已知了,因此是一個(gè)常量表達(dá)式。例如,你可能希望為堆棧類提供第三個(gè)參數(shù),這個(gè)參數(shù)指明遇到特定條件的時(shí)候使用的回調(diào)處理程序。明智地使用typedef可以大幅度簡(jiǎn)化那些表面上看起來(lái)很復(fù)雜的聲明,如下所示:
typedef void (*handler)( ... array<o(jì)bject^>^ );
template <class elemtype, int size, handler cback >
public ref class tstack {};
void defaulthandler( ... array<o(jì)bject^>^ ){ ... }
template < class elemtype,
int size = 1024,
handler cback = &defaulthandler >
public ref class tstack {};
void demonstration()
{
// 默認(rèn)的大小和處理程序
tstack<string^> ^ts1
熱門點(diǎn)擊
- CPLD開發(fā)板和FPGA開發(fā)板的區(qū)別
- 基于FPGA和AD1836的I2S接口設(shè)計(jì)
- vc中如何使用設(shè)備描述表
- Visual C++中調(diào)用DLL實(shí)現(xiàn)數(shù)據(jù)加密
- Visual C++6.0 API函數(shù)操作技
- VC++中進(jìn)程與多進(jìn)程管理的方法
- JavaCard CPU的設(shè)計(jì)與FPGA實(shí)現(xiàn)
- 如何用C語(yǔ)言開發(fā)DSP嵌入式系統(tǒng)
- C和C++ 字符串字面量的比較
- Xilinx針對(duì)Virtex-5 FXT F
推薦技術(shù)資料
- 聲道前級(jí)設(shè)計(jì)特點(diǎn)
- 與通常的Hi-Fi前級(jí)不同,EP9307-CRZ這臺(tái)分... [詳細(xì)]
- 首款新結(jié)構(gòu)硅基外腔混合集成光源芯片
- 全大核架構(gòu) X930 超大核的
- 計(jì)算子系統(tǒng)(Compute Sub Syst
- Neoverse CSS V3 架構(gòu)R
- Arm Neoverse CP
- Dimensity 9400芯
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究