Aracılığıyla paylaş


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-listTercih function-definition

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

generic-parameter:
attributesTercih class identifier
attributesTercih typename identifier

constraint-clause-list:
constraint-clause-listTercih 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-listuygulamak için kullanılan türleri belirtirsiniz. Bu liste öğesine karşılık gelir generic-parameter-listve isteğe bağlı constraint-clause-listkı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 structtek 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 MyBaseClassdevralan öğesini bildirirMyClass. MyClass , MyFunctiontemel sınıf içinde başka bir genel işlevi çağıran genel bir işlev MyBaseClassFunctioniçerir. içinde main, genel işlevi, MyFunctionfarklı 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!

Ayrıca bkz.

.NET ve UWP İçin Bileşen Uzantıları
Genel Türler