Windows Çalışma Zamanı ve Yönetilen Şablonlar (C++/CLI ve C++/CX)
Şablonlar, bir Windows Çalışma Zamanı veya ortak dil çalışma zamanı türünün prototipini tanımlamanızı ve ardından farklı şablon türü parametreleri kullanarak bu tür çeşitlemelerinin örneğini oluşturmanızı sağlar.
Tüm Çalışma Zamanları
Değer veya başvuru türlerinden şablonlar oluşturabilirsiniz. Değer veya başvuru türleri oluşturma hakkında daha fazla bilgi için bkz . Sınıflar ve Yapılar.
Standart C++ sınıf şablonları hakkında daha fazla bilgi için bkz . Sınıf Şablonları.
Windows Çalışma Zamanı
(Bu dil özelliği için yalnızca Windows Çalışma Zamanı geçerli olan bir açıklama yoktur.)
Gereksinimler
Derleyici seçeneği: /ZW
Ortak Dil Çalışma Zamanı
Aşağıdaki kod örneklerinde gösterilen yönetilen türlerden sınıf şablonları oluşturmanın bazı sınırlamaları vardır.
Gereksinimler
Derleyici seçeneği: /clr
Örnekler
Yönetilen tür şablonu parametresiyle genel bir tür örneği oluşturmak mümkündür, ancak genel tür şablonu parametresiyle yönetilen bir şablonun örneğini oluşturamazsınız. Bunun nedeni, genel türlerin çalışma zamanında çözümlenmesidir. Daha fazla bilgi için bkz . Genel Bilgiler ve Şablonlar (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
};
Genel bir tür veya işlev yönetilen şablonda iç içe yerleştirilemez.
// managed_templates_2.cpp
// compile with: /clr /c
template<class T> public ref class R {
generic<class T> ref class W {}; // C2959
};
Başvurulan derlemede tanımlanan şablonlara C++/CLI dil söz dizimi ile erişemezsiniz, ancak yansımayı kullanabilirsiniz. Şablon örneği başlatılmazsa, meta verilerde gösterilmez. Şablon örneği oluşturulursa meta verilerde yalnızca başvurulan üye işlevleri görüntülenir.
// 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();
}
Bir sınıfın yönetilen değiştiricisini, bir sınıf şablonunun kısmi uzmanlığında veya açık özelleştirmesinde değiştirebilirsiniz.
// 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> {};