泛型函数 (C++/CLI)
泛型函数是声明的类型参数的函数。 当调用,实际类型使用而不是类型参数。
所有平台
备注
此功能不适用于所有平台。
Windows 运行时
备注
此函数在 Windows 运行时不受支持。
要求
编译器选项: /ZW
公共语言运行时
泛型函数是声明的类型参数的函数。 当调用,实际类型使用而不是类型参数。
语法
[attributes] [modifiers]
return-type identifier <type-parameter identifier(s)>
[type-parameter-constraints clauses]
([formal-parameters])
{
function-body
}
参数
属性 (可选)
附加描述性信息。 有关特性和特性类的更多信息,请参见属性。修饰符 (可选)
函数的一个修饰符,如 st atic 的。,因为虚方法可能不是泛型的, virtual 不允许的。返回类型
由方法返回的类型。 如果返回类型无效,没有任何返回值需要。标识符
函数名。类型参数标识符
逗号分隔标识符的列表。正式参数 (可选)
参数列表。类型参数约束子句
这在能用作类型参数的类型指定限制,并对 泛型类型参数的约束 (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);
}
示例
可以重载泛型函数基于签名或 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) {}
};
示例
下面的示例使用泛型函数查找数组中的第一个元素。 声明它 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