在此处查看本文,最后一行对泛型的引用指定泛型在 C++/CX 中与接口和委托一起使用。
http://msdn.microsoft.com/en-us/library/windows/apps/br212455(v=vs.110).aspx
这是有道理的,因为它被定义为允许 C++/CX 编译器为实际对象编译本机代码函数的接口,然后以类似于 C++ 模板的方式使用通用接口。函数的本机代码被编译,通用接口用于处理不同的类型。
对于编译器来说,这似乎是 C++/CLR 和 C++/CX 之间的区别。/clr:允许泛型类、接口和委托。/ZW:仅限通用接口和委托。
如果您在这里查看http://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspx,您会注意到这些类没有通用规则。
但是,如果您阅读此主题http://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspx,您会注意到泛型被用作接口。
C++/CX 中的“通用类”是通过使用标准 C++ 模板实现的。实例化或编译器生成的特定类型的泛型被导出到元数据,而不是模板本身。因此,您可以从元数据中看到 MyClass 和 MyClass,但看不到原始 MyClass。对于作为泛型类型导出到元数据的泛型接口情况,情况并非如此。
可以在此处找到更多信息http://en.wikipedia.org/wiki/Windows_Runtime
因此,为了完全回答这个问题,到目前为止,方法中的代码是输出 dll 或 exe 中预编译的本机代码,并附加到实际的非泛型类。但是可以通过使用通用接口来通用地使用代码。因此,十个不同的类可以实现 IMyInterface,然后可以使用 IMyInterface 类型的变量来处理例如十种不同类型的实例。
因此,简短的回答是 C++/CX 中没有像 C++/CLR 中那样完整的泛型类。在 C++/CX 应用程序中使用模板获得相同的效果。如果您必须拥有 C++ 泛型,则使用使用 C++/CLI 制作的 dll,并从编译为 C++/CX 的程序中处理该代码。
笔记!我从检查各种文章中收集了很多信息,其中一些在 msdn 似乎说它们可能会发生变化。
现在将 C++/CX 中的通用接口与模板一起使用可能是他们的意图。因此,您创建了一个名为 MyClass 的模板,然后它实现了名为 MyInterface 的通用接口,因此如果您随后创建了一个 MyClass 模板实例化,新类型将自动实现 MyInterface,然后该接口可以在任何地方使用。因此,在编译的 dll 和头文件之外,其他 C++/CX 模块和文件可以在不需要头文件的情况下使用 MyInterface 等类型,因为模板实例化在编译的 dll 中,但是使用元数据的 c++ 文件知道如何创建 MyInterface 类型,因为它具有 MyInterface 的元数据,但没有 MyClass 的元数据。
简而言之,没有泛型类,C++/CX 中的泛型接口和委托支持实际上就像 C++/CLI 中的泛型一样工作。