Windows Runtime a spravované šablony (rozšíření komponent C++)
Šablony umožňují definovat prototyp Windows Runtime nebo společného typu runtime jazyka a potom vytvořte instanci tohoto typu variant pomocí parametrů typu jinou šablonu.
Všechny moduly runtime
Můžete vytvořit šablony z typu hodnoty nebo odkazu. Další informace o vytváření typů hodnoty nebo odkazu, naleznete v Třídy a struktury (rozšíření komponent C++).
Další informace o standardní šablony třídy jazyka C++, naleznete v Šablony třídy.
Prostředí Windows Runtime
(Žádné informace o této funkci jazyka neplatí pouze pro architekturu Windows Runtime.)
Požadavky
Možnost kompilátoru: /ZW
Common Language Runtime
K vytvoření šablony třídy ze spravovaných typů, které se projevují v následujících příkladech kódu existují určitá omezení.
Požadavky
Možnost kompilátoru: /clr
Příklady
Příklad
Je možné vytvořit instanci obecného typu s parametrem šablony spravovaný typ, ale nelze vytvořit instanci spravované šablona s obecný typ parametru šablony. Toto je, protože obecné typy, které jsou vyřešeny v době běhu. Další informace naleznete v tématu Obecné typy a šablony (Visual C++).
// 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
};
Příklad
Obecný typ nebo funkce nemůže být vnořen v šabloně spravované.
// managed_templates_2.cpp
// compile with: /clr /c
template<class T> public ref class R {
generic<class T> ref class W {}; // C2959
};
Příklad
Nelze získat přístup k šablony definované v odkazovaném sestavení s C + +/ CLI syntaxe jazyka, ale pomocí reflexe. Pokud šablona není vytvořena, není emitovány v metadatech. Šablona je vytvořena, zobrazí se pouze odkazované členské funkce v metadatech.
// 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();
}
Příklad
Můžete změnit modifikátorem spravované třídy v částečné specializace nebo explicitní specializace šablony třídy.
// 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> {};