Aracılığıyla paylaş


Genel Türler ve Şablonlar (C++/CLI)

Genel türler ve şablonlar, parametreli türler için destek sağlayan dil özellikleridir. Ancak, bunlar farklıdır ve farklı kullanımları vardır. Bu konu başlığında birçok farka genel bir bakış sunulmaktadır.

Daha fazla bilgi için bkz. Windows Çalışma Zamanı ve Yönetilen Şablonlar.

Şablonları ve Genel Türleri Karşılaştırma

Genel ve C++ şablonları arasındaki önemli farklar:

  • Türler çalışma zamanında yerine yenisi alınana kadar genel türler geneldir. Şablonlar derleme zamanında özelleştirilir, bu nedenle çalışma zamanında hala parametreli türler değildir

  • Ortak dil çalışma zamanı, MSIL'deki genel değerleri özellikle destekler. Çalışma zamanı genel türler hakkında bilgi edindiğinden, genel tür içeren bir derlemeye başvururken belirli türlerin yerine genel türler kullanılabilir. Şablonlar ise derleme zamanında normal türler halinde çözümlenebilir ve sonuçta elde edilen türler diğer derlemelerde özelleştirilebilir.

  • Aynı tür bağımsız değişkenlere sahip iki farklı derlemede uzmanlaşmış genel öğeler aynı türdedir. Aynı tür bağımsız değişkenlerine sahip iki farklı derlemede özelleştirilmiş şablonlar çalışma zamanı tarafından farklı türler olarak kabul edilir.

  • Genel türler, tüm başvuru türü bağımsız değişkenleri için kullanılan tek bir yürütülebilir kod parçası olarak oluşturulur (değer türü başına benzersiz bir uygulama olan değer türleri için bu geçerli değildir). JIT derleyicisi genel türler hakkında bilgi ediniyor ve kodu tür bağımsız değişkenleri olarak kullanılan başvuru veya değer türleri için iyileştirebiliyor. Şablonlar her özelleştirme için ayrı çalışma zamanı kodu oluşturur.

  • Genel değerler gibi template <int i> C {}tür olmayan şablon parametrelerine izin vermez. Şablonlar bunlara izin verir.

  • Genel değerler açık özelleştirmeye (belirli bir tür için özel bir şablon uygulaması) izin vermez. Şablonlar bunu yapar.

  • Genel değerler kısmi özelleştirmeye (tür bağımsız değişkenlerinin bir alt kümesi için özel bir uygulama) izin vermez. Şablonlar bunu yapar.

  • Genel değerler, tür parametresinin genel tür için temel sınıf olarak kullanılmasına izin vermez. Şablonlar bunu yapar.

  • Şablonlar şablon-şablon parametrelerini (örn. template<template<class T> class X> class MyClass) destekler, ancak genel değerler desteklemez.

Şablonları ve Genel Türleri Birleştirme

Genel türlerdeki temel fark, şablonları ve genel değerleri birleştiren uygulamalar oluşturmaya yönelik etkilere sahiptir. Örneğin, bu şablonu diğer dillerde genel olarak kullanıma sunabilmek için genel sarmalayıcı oluşturmak istediğiniz bir şablon sınıfınız olduğunu varsayalım. Şablonun derleme zamanında bu tür parametresine sahip olması gerektiğinden, genel bir tür parametresini şablona geçirir ancak genel, çalışma zamanına kadar tür parametresini çözümlemez. Şablonu genel bir şablon içinde iç içe yerleştirme de çalışmaz çünkü çalışma zamanında örneği oluşturulabilecek rastgele genel türler için derleme zamanında şablonları genişletmenin hiçbir yolu yoktur.

Örnek

Açıklama

Aşağıdaki örnekte şablonların ve genel türlerin birlikte kullanılmasına ilişkin basit bir örnek gösterilmektedir. Bu örnekte, şablon sınıfı parametresini genel türe geçirir. Bunun tersi mümkün değildir.

Bu deyim, C++/CLI derlemesine yerel şablon koduyla mevcut bir genel API üzerinde derleme yapmak istediğinizde veya genel türe ek parametre katmanı eklemeniz gerektiğinde, genel türlerin desteklemediği şablonların belirli özelliklerinden yararlanmak için kullanılabilir.

Kod

// templates_and_generics.cpp
// compile with: /clr
using namespace System;

generic <class ItemType>
ref class MyGeneric {
   ItemType m_item;

public:
   MyGeneric(ItemType item) : m_item(item) {}
   void F() {
      Console::WriteLine("F");
   }
};

template <class T>
public ref class MyRef {
MyGeneric<T>^ ig;

public:
   MyRef(T t) {
      ig = gcnew MyGeneric<T>(t);
      ig->F();
    }
};

int main() {
   // instantiate the template
   MyRef<int>^ mref = gcnew MyRef<int>(11);
}
F

Ayrıca bkz.

Genel Türler