Windows 运行时和托管模板(C++ 组件扩展)

使用其他模板类型参数,模板可以定义窗口运行时或公共语言运行时类型的原型,然后实例化该类型的变体。

所有运行时

可以根据值创建模板或引用类型。有关创建值的更多信息或引用类型,请参见 类和结构(C++ 组件扩展)

有关标准 C++ 类模板的更多信息,请 选件类模板参见。

运行时的窗口

(不适用于运行时仅的窗口。) 此语言功能的备注

ms177213.collapse_all(zh-cn,VS.110).gif要求

编译器选项: /ZW

公共语言运行时

有一些限制在创建从托管类型的类模板,如下面的代码示例演示。

ms177213.collapse_all(zh-cn,VS.110).gif要求

编译器选项: /clr

ms177213.collapse_all(zh-cn,VS.110).gif示例

示例

实例化托管类型模板参数的泛型类型是可能的,但是,无法实例化具有泛型类型模板参数的一个托管模板。这是因为,泛型类型是在运行时解析。有关更多信息,请参见 泛型和模板 (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
};

示例

泛型类型或函数在一个托管模板不能嵌套。

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

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

示例

不能在具有 C++/CLI 语言语法的引用的程序集中定义的访问模板,但是,可以使用反射。如果模板进行实例化,它在元数据不发出。如果模板实例化,因此,只有引用的成员函数将出现在元数据。

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

示例

您可以更改类的托管修饰符在部分专用化或类模板的显式专用化的。

// 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> {};

请参见

概念

适用于运行时平台的组件扩展