泛型函式 (C++/CLI)
泛型函式是使用型別參數宣告的函式。 呼叫,會使用實際型別,而不是型別參數。
所有平台
備註
這項功能並不適用於所有平台。
Windows 執行階段
備註
這項功能不支援在Windows 執行階段。
需求
編譯器選項:/ZW
Common Language Runtime
泛型函式是使用型別參數宣告的函式。 呼叫,會使用實際型別,而不是型別參數。
語法
[attributes] [modifiers]
return-type identifier <type-parameter identifier(s)>
[type-parameter-constraints clauses]
([formal-parameters])
{
function-body
}
參數
屬性 (可省略)
其他的宣告式資訊。 如需有關屬性和屬性類別的詳細資訊,請參閱屬性。修飾詞 (可省略)
函式,這類的抵銷科目的修飾詞atic。 virtual不能因為虛擬方法不可為泛型。傳回型別
此方法傳回的型別。 如果傳回型別是 void,沒有傳回值是必要的。identifier
函式名稱。型別參數的 identifier(s)
逗點分隔的識別項清單。正式的參數 (可省略)
參數清單。型別參數條件約束的子句
這可以做為型別引數,型別上指定限制,並採用下列格式中指定泛型型別參數的條件約束 (C++/CLI)。函式主體
可能參照到型別參數識別項的方法主體。
備註
泛用的函式都是使用泛型型別參數宣告的函式。 它們可能會在類別或結構或獨立的函式的方法。 單一的一般宣告還隱含宣告之差異只在於替換不同的實際型別為泛型型別參數的函式家族。
在Visual C++,類別或結構的建構函式不能以泛型型別參數宣告。
呼叫時,實際的型別取代泛型型別參數。 使用語法類似於樣板函式呼叫的所有在角括弧中,可能會明確指定實際型別。 如果呼叫不具型別參數,編譯器會嘗試推斷從函式呼叫中所提供的參數的實際型別。 如果無法推算出預期的型別引數,從所使用的參數,編譯器會報告錯誤。
需求
編譯器選項:/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);
}
範例
泛用的函式可根據簽章或引數數目時,函式上的型別參數數目多載。 此外,泛用的函式可以多載具有相同名稱的非泛型函式,只要在某些型別參數的函式不同。 例如,下列函式可以多載:
// 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) {}
};
範例
下列範例會使用泛型函式,來尋找陣列中的第一個項目。 它會宣告MyClass,這是繼承自基底類別MyBaseClass。 MyClass包含的一般函數, MyFunction,它會呼叫另一個泛用的函式, MyBaseClassFunction,在基底類別中。 在主要,泛用的函式, 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!"));
}
Output