泛型函式 (C++/CLI)
泛型函式是使用型別參數宣告的函式。 呼叫時,會使用實際型別,而不是型別參數。
所有平台
備註
此功能不適用於所有平臺。
Windows 執行階段
備註
Windows 執行階段 不支援此功能。
需求
不適用。
通用語言執行平台
泛型函式是使用泛型型別參數宣告的函式。 呼叫時,會使用實際型別,而不是型別參數。
語法
generic-declaration
:
generic
<
generic-parameter-list
>
optconstraint-clause-list
function-definition
generic-parameter-list
:
generic-parameter
generic-parameter-list
,
generic-parameter
generic-parameter
:
attributes
opt class
identifier
attributes
opt typename
identifier
constraint-clause-list
:
constraint-clause-list
opt constraint-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
的方法。 單一泛型宣告會以隱含方式宣告一系列函式,各函式之間的差異只在於將泛型型別參數取代為不同的實際型別。
或 struct
建class
構函式可能無法使用泛型型別參數宣告。
呼叫時,泛型型別參數會被實際型別取代。 實際的類型可以使用類似函式範本呼叫的語法,在角括弧中明確指定。 如果在沒有型別參數的情況下呼叫,編譯器會嘗試從函式呼叫中提供的參數推算實際型別。 如果無法從所使用的參數推斷預期的型別自變數,編譯程式會報告錯誤。
需求
編譯器選項:/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) {}
};
以下範例會使用泛型函式尋找陣列中的第一個元素。 它會宣告繼承自基底類別 MyBaseClass
的 MyClass
。 MyClass
包含一個泛型函式 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!