Bagikan melalui


Windows Runtime dan Templat Terkelola (C++/CLI dan C++/CX)

Templat memungkinkan Anda menentukan prototipe Windows Runtime atau jenis runtime bahasa umum, lalu membuat instans variasi jenis tersebut dengan menggunakan parameter jenis templat yang berbeda.

Semua Runtime

Anda dapat membuat templat dari jenis nilai atau referensi. Untuk informasi selengkapnya tentang membuat jenis nilai atau referensi, lihat Kelas dan Struktur.

Untuk informasi selengkapnya tentang templat kelas C++ standar, lihat Templat Kelas.

Windows Runtime

(Tidak ada keterangan untuk fitur bahasa ini yang hanya berlaku untuk Windows Runtime.)

Persyaratan

Opsi pengkompilasi: /ZW

Runtime Bahasa Umum

Ada beberapa batasan untuk membuat templat kelas dari jenis terkelola, yang ditunjukkan dalam contoh kode berikut.

Persyaratan

Opsi pengkompilasi: /clr

Contoh

Dimungkinkan untuk membuat instans jenis generik dengan parameter templat jenis terkelola, tetapi Anda tidak dapat membuat instans templat terkelola dengan parameter templat jenis generik. Ini karena jenis generik diselesaikan pada runtime. Untuk informasi selengkapnya, lihat Generik dan Templat (C++/CLI).

// managed_templates.cpp
// compile with: /clr /c

generic<class T>
ref class R;

template<class T>
ref class Z {
   // Instantiate a generic with a template parameter.
   R<T>^ r;    // OK
};

generic<class T>
ref class R {
   // Cannot instantiate a template with a generic parameter.
   Z<T>^ z;   // C3231
};

Jenis atau fungsi generik tidak dapat disarangkan dalam templat terkelola.

// managed_templates_2.cpp
// compile with: /clr /c

template<class T> public ref class R {
   generic<class T> ref class W {};   // C2959
};

Anda tidak dapat mengakses templat yang ditentukan dalam rakitan yang direferensikan dengan sintaks bahasa C++/CLI, tetapi Anda dapat menggunakan pantulan. Jika templat tidak dibuat, templat tidak dipancarkan dalam metadata. Jika templat dibuat, hanya fungsi anggota yang dirujuk yang akan muncul dalam metadata.

// managed_templates_3.cpp
// compile with: /clr

// Will not appear in metadata.
template<class T> public ref class A {};

// Will appear in metadata as a specialized type.
template<class T> public ref class R {
public:
   // Test is referenced, will appear in metadata
   void Test() {}

   // Test2 is not referenced, will not appear in metadata
   void Test2() {}
};

// Will appear in metadata.
generic<class T> public ref class G { };

public ref class S { };

int main() {
   R<int>^ r = gcnew R<int>;
   r->Test();
}

Anda dapat mengubah pengubah terkelola kelas dalam spesialisasi parsial atau spesialisasi eksplisit templat kelas.

// managed_templates_4.cpp
// compile with: /clr /c

// class template
// ref class
template <class T>
ref class A {};

// partial template specialization
// value type
template <class T>
value class A <T *> {};

// partial template specialization
// interface
template <class T>
interface class A<T%> {};

// explicit template specialization
// native class
template <>
class A <int> {};

Baca juga

Ekstensi Komponen untuk .NET dan UWP