8

我在 Internet 上找不到任何关于此的内容,因此我正在寻找对 C++/CX 实施方式有深入了解的人。关于 C++/CX的Wikipedia 文章说它支持基于运行时的泛型,这意味着您不需要具有完整实现的头文件来实例化泛型类型。我了解这对 .NET 是如何工作的(程序集包含 IL 代码,JIT 可以在其中插入具体类型并在有新实例时对其进行编译),但是在 C++/CX(它是本机编译的)中没有 JIT 可以编辑运行时的代码(我认为这对于 x86 机器代码来说非常困难)

那么这里的诀窍是什么,是用拳击进行类型擦除还是一些新的人为方案?

(我知道关于类型的元数据是以 .NET 格式存储的,我在关注方法中的代码)

4

2 回答 2

4

在此处查看本文,最后一行对泛型的引用指定泛型在 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 中的泛型一样工作。

于 2012-05-17T17:15:30.253 回答
3

据我所知,不支持任意 C++/CX 泛型。C++/CX 可以使用 winrt 参数化接口,这些接口显示为 C++ 模板特化,但不能导出任意泛型。

您可以从 Windows::Foundation 命名空间创建参数化接口的特化,但不能创建原始参数化接口(公共引用模板)。

于 2012-05-17T18:32:44.073 回答