Bagikan melalui


Generik dan Templat (C++/CLI)

Generik dan templat adalah fitur bahasa yang menyediakan dukungan untuk jenis berparameter. Namun, mereka berbeda dan memiliki penggunaan yang berbeda. Topik ini memberikan gambaran umum tentang banyak perbedaan.

Untuk informasi selengkapnya, lihat Windows Runtime dan Templat Terkelola.

Membandingkan Templat dan Generik

Perbedaan utama antara generik dan templat C++:

  • Generik bersifat umum sampai jenis digantikan pada runtime. Templat dikhususkan pada waktu kompilasi sehingga tidak masih berparameter jenis saat runtime

  • Runtime bahasa umum secara khusus mendukung generik di MSIL. Karena runtime mengetahui tentang generik, jenis tertentu dapat diganti dengan jenis generik saat merujuk perakitan yang berisi jenis generik. Templat, sebaliknya, diselesaikan menjadi jenis biasa pada waktu kompilasi dan jenis yang dihasilkan mungkin tidak dikhususkan dalam rakitan lain.

  • Generik yang dikhususkan dalam dua rakitan berbeda dengan argumen jenis yang sama adalah jenis yang sama. Templat yang dikhususkan dalam dua rakitan berbeda dengan argumen jenis yang sama dianggap oleh runtime menjadi jenis yang berbeda.

  • Generik dihasilkan sebagai satu bagian dari kode yang dapat dieksekusi yang digunakan untuk semua argumen jenis referensi (ini tidak benar untuk jenis nilai, yang memiliki implementasi unik per jenis nilai). Pengkompilasi JIT tahu tentang generik dan mampu mengoptimalkan kode untuk jenis referensi atau nilai yang digunakan sebagai argumen jenis. Templat menghasilkan kode runtime terpisah untuk setiap spesialisasi.

  • Generik tidak mengizinkan parameter templat non-jenis, seperti template <int i> C {}. Templat memungkinkannya.

  • Generik tidak mengizinkan spesialisasi eksplisit (yaitu, implementasi kustom templat untuk jenis tertentu). Templat lakukan.

  • Generik tidak mengizinkan spesialisasi parsial (implementasi kustom untuk subset argumen jenis). Templat lakukan.

  • Generik tidak mengizinkan parameter jenis digunakan sebagai kelas dasar untuk jenis generik. Templat lakukan.

  • Templat mendukung parameter templat-templat (misalnya template<template<class T> class X> class MyClass), tetapi generik tidak.

Menggabungkan Templat dan Generik

Perbedaan dasar dalam generik memiliki implikasi untuk membangun aplikasi yang menggabungkan templat dan generik. Misalnya, Anda memiliki kelas templat yang ingin Anda buat pembungkus generik untuk mengekspos templat tersebut ke bahasa lain sebagai generik. Anda tidak dapat meminta generik mengambil parameter jenis yang kemudian diteruskannya ke templat, karena templat perlu memiliki parameter jenis tersebut pada waktu kompilasi, tetapi generik tidak akan menyelesaikan parameter jenis hingga runtime. Menyarangkan templat di dalam generik juga tidak akan berfungsi karena tidak ada cara untuk memperluas templat pada waktu kompilasi untuk jenis generik sewenang-wenang yang dapat diinstansiasi pada runtime.

Contoh

Deskripsi

Contoh berikut menunjukkan contoh sederhana penggunaan templat dan generik bersama-sama. Dalam contoh ini, kelas templat meneruskan parameternya ke jenis generik. Kebalikannya tidak dimungkinkan.

Idiom ini dapat digunakan ketika Anda ingin membangun API generik yang ada dengan kode templat yang lokal untuk rakitan C++/CLI, atau ketika Anda perlu menambahkan lapisan parameterisasi tambahan ke jenis generik, untuk memanfaatkan fitur templat tertentu yang tidak didukung oleh generik.

Kode

// 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

Baca juga

Generik