Genel işlevler (C++/CLI)
Genel işlev, tür parametreleriyle bildirilen bir işlevdir. Çağrıldığında, tür parametreleri yerine gerçek türler kullanılır.
Tüm platformlar
Açıklamalar
Bu özellik tüm platformlar için geçerli değildir.
Windows Çalışma Zamanı
Açıklamalar
Bu özellik Windows Çalışma Zamanı desteklenmez.
Gereksinimler
Uygulanamaz.
Ortak Dil Çalışma Zamanı
Genel işlev, genel tür parametreleriyle bildirilen bir işlevdir. Çağrıldığında, tür parametreleri yerine gerçek türler kullanılır.
Sözdizimi
generic-declaration
:
generic
<
generic-parameter-list
>
constraint-clause-list
Tercih function-definition
generic-parameter-list
:
generic-parameter
generic-parameter-list
,
generic-parameter
generic-parameter
:
attributes
Tercih class
identifier
attributes
Tercih typename
identifier
constraint-clause-list
:
constraint-clause-list
Tercih 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
Parametreler
generic-parameter-list
İsteğe bağlı olarak öznitelikli genel tür parametre tanımlayıcılarının virgülle ayrılmış listesi.
attributes
(İsteğe bağlı) Ek bildirim temelli bilgiler. Öznitelikler ve öznitelik sınıfları hakkında daha fazla bilgi için bkz . öznitelikler.
constraint-clause-list
Bu isteğe bağlı liste, tür bağımsız değişkenleri olarak kullanılabilecek türlerle ilgili kısıtlamaları belirtir. Genel tür parametrelerinde (C++/CLI) Kısıtlamalar bölümünde belirtilen formu alır.
function-definition
Bir yöntemin veya tek başına işlevin tanımı. sanal yöntemler genel olmayabileceği için işlevde izin verilmeyen bir virtual
değiştirici olmayabilir. İşlevin gövdesi genel tür parametre tanımlayıcılarına başvurabilir. İşlev bir operator
işlev olabilir.
generic-id
Genel bir işlevin örneğini çağırdığınızda, içinde bunu generic-argument-list
uygulamak için kullanılan türleri belirtirsiniz. Bu liste öğesine karşılık gelir generic-parameter-list
ve isteğe bağlı constraint-clause-list
kısıtlamaları karşılamalıdır.
generic-name
Genel bir işlevin adı bir identifier
olabilir veya bir operator
işlev olabilir.
Açıklamalar
Genel işlevler, bir veya daha fazla genel tür parametresiyle bildirilen işlevlerdir. Bir veya veya struct
tek başına işlevlerdeki class
yöntemler olabilir. Tek bir genel bildirim, yalnızca genel tür parametresi için farklı bir gerçek türün değiştirilmesinde farklılık gösteren bir işlev ailesini örtük olarak bildirir.
Veya class
struct
oluşturucu genel tür parametreleriyle bildirilmeyebilir.
Çağrıldığında, genel tür parametresi gerçek bir türle değiştirilir. Gerçek tür, işlev şablonu çağrısına benzer söz dizimi kullanılarak açılı köşeli ayraçlar içinde açıkça belirtilebilir. Tür parametreleri olmadan çağrılırsa, derleyici işlev çağrısında sağlanan parametrelerden gerçek türün çıkarılmaya çalışılır. İstenen tür bağımsız değişkeni kullanılan parametrelerden çıkarılamıyorsa derleyici bir hata bildirir.
Gereksinimler
Derleyici seçeneği: /clr
Örnekler
Aşağıdaki kod örneğinde genel bir işlev gösterilmektedir.
// 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);
}
Genel işlevler, bir işlevdeki tür parametrelerinin sayısı olan imzaya veya ariteye göre aşırı yüklenebilir. Ayrıca, işlevler bazı tür parametrelerinde farklılık gösterdiği sürece, genel işlevler aynı ada sahip genel olmayan işlevlerle aşırı yüklenebilir. Örneğin, aşağıdaki işlevler aşırı yüklenebilir:
// 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) {}
};
Aşağıdaki örnekte bir dizideki ilk öğeyi bulmak için genel bir işlev kullanılmaktadır. temel sınıfından MyBaseClass
devralan öğesini bildirirMyClass
. MyClass
, MyFunction
temel sınıf içinde başka bir genel işlevi çağıran genel bir işlev MyBaseClassFunction
içerir. içinde main
, genel işlevi, MyFunction
farklı tür bağımsız değişkenleri kullanılarak çağrılır.
// 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!