Sdílet prostřednictvím


Windows Runtime a spravované šablony (C++/CLI a C++/CX)

Šablony umožňují definovat prototyp typu prostředí Windows Runtime nebo modulu CLR (Common Language Runtime) a následně vytvořit instanci variant tohoto typu pomocí různých parametrů typu šablony.

Všechny moduly runtime

Šablony můžete vytvářet z hodnotových nebo referenčních typů. Další informace o vytváření hodnot nebo referenčních typů naleznete v tématu Třídy a struktury.

Další informace o standardních šablonách tříd jazyka C++ naleznete v tématu Šablony tříd.

prostředí Windows Runtime

(Pro tuto funkci jazyka neexistují žádné poznámky, které platí pouze pro prostředí Windows Runtime.)

Požadavky

Možnost kompilátoru: /ZW

CLR (Common Language Runtime)

Vytváření šablon tříd ze spravovaných typů má určitá omezení, která jsou ukázaná v následujících příkladech kódu.

Požadavky

Možnost kompilátoru: /clr

Příklady

Pomocí parametru šablony spravovaného typu je možné vytvořit instanci obecného typu, ale nemůžete vytvořit instanci spravované šablony s parametrem šablony obecného typu. Důvodem je to, že obecné typy jsou vyřešeny za běhu. Další informace najdete v tématu Obecné typy a šablony (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
};

Obecný typ nebo funkce nelze vnořit do spravované šablony.

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

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

Nelze získat přístup k šablonám definovaným v odkazovaném sestavení se syntaxí jazyka C++/CLI, ale můžete použít reflexi. Pokud není vytvořena instance šablony, nevygeneruje se v metadatech. Pokud je vytvořena instance šablony, zobrazí se v metadatech pouze odkazované členské funkce.

// 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();
}

Spravovaný modifikátor třídy můžete změnit v částečné specializaci nebo explicitní specializaci š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> {};

Viz také

Přípony komponent pro .NET a UPW