共用方式為


泛型和樣板 (Visual C++)

泛型和樣板是兩個參數型型別提供支援的語言功能。 不過,它們會改變,而且有不同的用途。 本主題提供許多的差異的概觀。

如需詳細資訊,請參閱 Windows 執行階段和 Managed 樣板 (C++ 元件擴充功能)範本概觀

比較的樣板和泛型

泛型和 C++ 樣板之間的主要差異:

  • 泛型是指一些泛用型別取代它們在執行階段之前。 範本被專門用來編譯時間使它們不再是在執行階段的仍然是參數化型別

  • 明確地說,Common Language Runtime會在 MSIL 中支援泛型。 因為執行階段知道泛型,特定的型別可以取代泛型型別參考組譯碼包含泛型型別時。 不可能其他組件中特製化樣板,相反地,解析一般型別在編譯時期和結果型別。

  • 泛型特製化中兩個不同的組件具有相同的型別引數是相同的型別。 樣板進行特製化中兩個相同的型別引數會被視為由執行階段不同類型的不同組件。

  • 泛用會產生為單一可執行檔程式碼(這不是實值型別,有一個唯一的實作,每個實值型別,則為 true) 的所有參考型別引數使用。 JIT編譯器知道泛型,且可以最佳化程式碼做為型別引數參考或實值型別。 範本會產生每個特製化的另一個執行階段程式碼。

  • 泛型無法進行非型別範本參數,例如template <int i> C {}。 範本可讓它們。

  • 泛用不允許明確特製化 (也就是針對特定類型的範本的自訂實作)。 樣板所要做。

  • 泛用不允許部份特製化 (自訂實作的子集合的型別引數)。 樣板所要做。

  • 泛用不允許型別參數當做基底類別的泛型型別。 樣板所要做。

  • 範本都支援範本的範本參數 (例如: template<template<class T> class X> class MyClass),但泛型則否。

結合範本和泛用

  • 基本的差異,在泛型中有建置合併範本和泛型的應用程式的影響。 例如,假設您有一個您想要建立的範本類別。 您不能有泛型的攜帶型別參數,然後傳遞至範本中,但因為範本必須具有該型別參數,在編譯時期,但一般無法解析型別參數執行階段之前。 巢狀結構內的泛用的範本沒有用任何一個,因為沒有方法可展開範本在編譯階段為任意無法在執行階段具現化的泛型型別。

範例

sbh15dya.collapse_all(zh-tw,VS.110).gif描述

下列範例會示範一個簡單的範例一起使用樣板和泛型。 在這個範例中,該範本類別會將透過其參數傳遞至泛型型別。 不能相反。

當您想要組建現有的泛用 API 以範本程式碼是在區域之 Visual C++組譯碼,或當您需要加入了額外的參數化成為泛型型別中,利用某些功能的範本不支援泛型,則可以使用此慣用句。

sbh15dya.collapse_all(zh-tw,VS.110).gif程式碼

// templates_and_generics.cpp
// compile with: /clr
using namespace System;

generic <class ItemType>
ref class MyGeneric {
   ItemType m_item;

public:
   MyGeneric(ItemType item) : m_item(item) {}
   void F() { 
      Console::WriteLine("F"); 
   }
};

template <class T>
public ref class MyRef {
MyGeneric<T>^ ig;

public:
   MyRef(T t) {
      ig = gcnew MyGeneric<T>(t);
      ig->F();
    }    
};

int main() {
   // instantiate the template
   MyRef<int>^ mref = gcnew MyRef<int>(11);
}

sbh15dya.collapse_all(zh-tw,VS.110).gifOutput

F

請參閱

其他資源

泛型 (C++ 元件擴充功能)