浓毛老太交欧美老妇热爱乱,蜜臀性色av免费,妺妺窝人体色www看美女,久久久久久久久久久大尺度免费视频,麻豆人妻无码性色av专区

位置:51電子網(wǎng) » 技術(shù)資料 » EDA/PLD

C++/CLR泛型與C++模板的對(duì)比

發(fā)布時(shí)間:2008/8/23 0:00:00 訪問(wèn)次數(shù):475

  visual studio 2005把泛型編程的類型參數(shù)模型引入了微軟.net框架組件。c++/cli支持兩種類型參數(shù)機(jī)制--通用語(yǔ)言運(yùn)行時(shí)(clr)泛型和c++模板。本文將介紹兩者之間的一些區(qū)別--特別是參數(shù)列表和類型約束模型之間的區(qū)別。

參數(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 );
   }
};

  此外,如果模板類設(shè)計(jì)者可以為每個(gè)參數(shù)指定默認(rèn)值,使用起來(lái)就可能方便多了。例如,把緩沖區(qū)的默認(rèn)大小設(shè)置為1kb就是很好的。在模板機(jī)制下,可以給參數(shù)提供默認(rèn)值,如下所示:

// 帶有默認(rèn)值的模板聲明
template <class elemtype, int size = 1024>
public ref class fixedsizestack {};

  用戶可以通過(guò)提供明確的第二個(gè)值來(lái)重載默認(rèn)大小值:

// 最多128個(gè)字符串實(shí)例的堆棧
fixedsizestate<string^, 128> ^tbs = gcnew fixedsizestack<string^, 128>;

  否則,由于沒(méi)有提供第二個(gè)參數(shù),它使用了相關(guān)的默認(rèn)值,如下所示:

// 最多1024個(gè)字符串實(shí)例的堆棧
fixedsizestack<string^> ^tbs = gcnew fixedsizestack<string^>;

// iso-c++名字空間std中的默認(rèn)類型參數(shù)值示例
{
  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è)計(jì)的角度來(lái)說(shuō)很難證明它的正確性,因?yàn)橐话銇?lái)說(shuō)容器不會(huì)集中在在單個(gè)默認(rèn)類型上。

  指針也可以作為非類型參數(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 {};

  當(dāng)然,你可以為處理程序提供默認(rèn)值--在這個(gè)例子中,是一個(gè)已有的方法的地址。例如,下面的緩沖區(qū)聲明就提供了大小和處理程序:

void defaulthandler( ... array<o(jì)bject^>^ ){ ... }

template < class elemtype,
int size = 1024,
handler cback = &defaulthandler >
public ref class tstack {};

  由于默認(rèn)值的位置次序優(yōu)先于命名次序,因此如果不提供明確的大小值(即使這個(gè)大小與默認(rèn)值是重復(fù)的),也就無(wú)法提供重載處理程序。下面就是可能用到的修改堆棧的方法:

void demonstration()
{
  // 默認(rèn)的大小和處理程序
  tstack<string^> ^ts1

  visual studio 2005把泛型編程的類型參數(shù)模型引入了微軟.net框架組件。c++/cli支持兩種類型參數(shù)機(jī)制--通用語(yǔ)言運(yùn)行時(shí)(clr)泛型和c++模板。本文將介紹兩者之間的一些區(qū)別--特別是參數(shù)列表和類型約束模型之間的區(qū)別。

參數(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 );
   }
};

  此外,如果模板類設(shè)計(jì)者可以為每個(gè)參數(shù)指定默認(rèn)值,使用起來(lái)就可能方便多了。例如,把緩沖區(qū)的默認(rèn)大小設(shè)置為1kb就是很好的。在模板機(jī)制下,可以給參數(shù)提供默認(rèn)值,如下所示:

// 帶有默認(rèn)值的模板聲明
template <class elemtype, int size = 1024>
public ref class fixedsizestack {};

  用戶可以通過(guò)提供明確的第二個(gè)值來(lái)重載默認(rèn)大小值:

// 最多128個(gè)字符串實(shí)例的堆棧
fixedsizestate<string^, 128> ^tbs = gcnew fixedsizestack<string^, 128>;

  否則,由于沒(méi)有提供第二個(gè)參數(shù),它使用了相關(guān)的默認(rèn)值,如下所示:

// 最多1024個(gè)字符串實(shí)例的堆棧
fixedsizestack<string^> ^tbs = gcnew fixedsizestack<string^>;

// iso-c++名字空間std中的默認(rèn)類型參數(shù)值示例
{
  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è)計(jì)的角度來(lái)說(shuō)很難證明它的正確性,因?yàn)橐话銇?lái)說(shuō)容器不會(huì)集中在在單個(gè)默認(rèn)類型上。

  指針也可以作為非類型參數(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 {};

  當(dāng)然,你可以為處理程序提供默認(rèn)值--在這個(gè)例子中,是一個(gè)已有的方法的地址。例如,下面的緩沖區(qū)聲明就提供了大小和處理程序:

void defaulthandler( ... array<o(jì)bject^>^ ){ ... }

template < class elemtype,
int size = 1024,
handler cback = &defaulthandler >
public ref class tstack {};

  由于默認(rèn)值的位置次序優(yōu)先于命名次序,因此如果不提供明確的大小值(即使這個(gè)大小與默認(rèn)值是重復(fù)的),也就無(wú)法提供重載處理程序。下面就是可能用到的修改堆棧的方法:

void demonstration()
{
  // 默認(rèn)的大小和處理程序
  tstack<string^> ^ts1

相關(guān)IC型號(hào)

熱門點(diǎn)擊

 

推薦技術(shù)資料

聲道前級(jí)設(shè)計(jì)特點(diǎn)
    與通常的Hi-Fi前級(jí)不同,EP9307-CRZ這臺(tái)分... [詳細(xì)]
版權(quán)所有:51dzw.COM
深圳服務(wù)熱線:13692101218  13751165337
粵ICP備09112631號(hào)-6(miitbeian.gov.cn)
公網(wǎng)安備44030402000607
深圳市碧威特網(wǎng)絡(luò)技術(shù)有限公司
付款方式


 復(fù)制成功!