泛型函式 (C++/CLI)

泛型函式是使用型別參數宣告的函式。 呼叫時,會使用實際型別,而不是型別參數。

所有平台

備註

此功能不適用於所有平臺。

Windows 執行階段

備註

Windows 執行階段不支援此功能。

需求

不適用。

Common Language Runtime

泛型函式是使用泛型型別參數宣告的函式。 呼叫時,會使用實際型別,而不是型別參數。

語法

generic-declaration
generic<generic-parameter-list>constraint-clause-listoptfunction-definition

generic-parameter-list
generic-parameter
generic-parameter-list , generic-parameter

generic-parameter
attributesoptclassidentifier
attributesopttypenameidentifier

constraint-clause-list
constraint-clause-listoptconstraint-clause

constraint-clause
where identifier : constraint-item-list

constraint-item-list
constraint-item
constraint-item-list , constraint-item

constraint-item
type-id
ref class
ref struct
value class
value struct
gcnew ( )

generic-id
generic-name < generic-argument-list >

generic-name
identifier
operator-function-id

generic-argument-list
generic-argument
generic-argument-list , generic-argument

generic-argument
type-id

參數

generic-parameter-list
選擇性屬性化泛型型別參數識別碼的逗號分隔清單。

attributes
(選擇性)額外的宣告式資訊。 如需屬性和屬性類別的詳細資訊,請參閱 屬性

constraint-clause-list
此選擇性清單會指定可用於型別引數的類型限制。 它會採用泛型型別參數的條件約束中指定的 格式(C++/CLI)。

function-definition
方法或獨立函式的定義。 函式可能沒有 virtual 修飾詞,因為虛擬方法可能不是泛型,因此不允許。 函式的主體可能會參考泛型型別參數識別碼。 函式可能是函 operator 式。

generic-id
當您叫用泛型函式的實例時,您會指定用來在 中 generic-argument-list 實作它的型別。 此清單對應至 generic-parameter-list ,而且必須滿足選擇性 constraint-clause-list 的條件約束。

generic-name
泛型函式可能會有 identifier 作為其名稱,或可能是函 operator 式。

備註

泛型函式是使用一或多個泛型型別參數宣告的函式。 它們可能是 或 或 struct 獨立函式中 class 的方法。 單一泛型宣告會以隱含方式宣告一系列函式,各函式之間的差異只在於將泛型型別參數取代為不同的實際型別。

structclass 構函式可能無法使用泛型型別參數宣告。

呼叫時,泛型型別參數會被實際型別取代。 實際的類型可以使用類似函式範本呼叫的語法,在角括弧中明確指定。 如果在沒有型別參數的情況下呼叫,編譯器會嘗試從函式呼叫中提供的參數推算實際型別。 如果無法從所使用的參數推斷預期的型別引數,編譯器會報告錯誤。

需求

編譯器選項:/clr

範例

以下程式碼範例會說明泛型函式。

// generics_generic_function_1.cpp
// compile with: /clr
generic <typename ItemType>
void G(int i) {}

ref struct A {
   generic <typename ItemType>
   void G(ItemType) {}

   generic <typename ItemType>
   static void H(int i) {}
};

int main() {
   A myObject;

   // generic function call
   myObject.G<int>(10);

   // generic function call with type parameters deduced
   myObject.G(10);

   // static generic function call
   A::H<int>(10);

   // global generic function call
   G<int>(10);
}

泛型函式可以根據簽章或 arity 來多載函式上的類型參數數目。 此外,只要函式的部分型別參數不一樣,就可以將名稱相同的泛型函式與非泛型函式一起多載。 例如,可以多載下列函式:

// generics_generic_function_2.cpp
// compile with: /clr /c
ref struct MyClass {
   void MyMythod(int i) {}

   generic <class T>
   void MyMythod(int i) {}

   generic <class T, class V>
   void MyMythod(int i) {}
};

以下範例會使用泛型函式尋找陣列中的第一個元素。 它會宣告繼承自基底類別 MyBaseClassMyClassMyClass 包含一個泛型函式 MyFunction,它會呼叫基底類別內的另一個泛型函式 MyBaseClassFunction。 在 main 中則會使用不同的型別引數呼叫泛型函式 MyFunction

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

ref class MyBaseClass {
protected:
   generic <class ItemType>
   ItemType MyBaseClassFunction(ItemType item) {
      return item;
   }
};

ref class MyClass: public MyBaseClass {
public:
   generic <class ItemType>
   ItemType MyFunction(ItemType item) {
      return MyBaseClass::MyBaseClassFunction<ItemType>(item);
   }
};

int main() {
   MyClass^ myObj = gcnew MyClass();

   // Call MyFunction using an int.
   Console::WriteLine("My function returned an int: {0}",
                           myObj->MyFunction<int>(2003));

   // Call MyFunction using a string.
   Console::WriteLine("My function returned a string: {0}",
   myObj->MyFunction<String^>("Hello generic functions!"));
}
My function returned an int: 2003
My function returned a string: Hello generic functions!

另請參閱

適用於.NET 和 UWP 的元件延伸模組
泛型