泛型在 C++/CX 中的工作原理
Posted
技术标签:
【中文标题】泛型在 C++/CX 中的工作原理【英文标题】:How generics work in C++/CX 【发布时间】:2012-05-25 03:15:29 【问题描述】:我在 Internet 上找不到任何关于此的信息,因此我正在寻找对 C++/CX 实施方式有深入了解的人。 C++/CX 上的Wikipedia article 表示它支持基于运行时的泛型,这意味着您不需要具有完整实现的头文件来实例化泛型类型。我了解这对 .NET 是如何工作的(程序集包含 IL 代码,JIT 可以在其中插入具体类型并在有新实例时对其进行编译),但是在 C++/CX(它是本机编译的)中没有 JIT 可以编辑运行时的代码(我认为这对于 x86 机器代码来说非常困难)
那么这里的诀窍是什么,是使用拳击或一些新的人为方案进行类型擦除?
(我知道关于类型的元数据是以 .NET 格式存储的,我在关注方法中的代码)
【问题讨论】:
闻起来像 Java 对泛型的“让我们将所有内容都转换为 Object 然后再返回”的方法。 一个基于运行时的泛型将是。 C++ 的泛型类型擦除是 boost::any,但是如果你不需要,你不应该做运行时泛型,而且大多数人从来不需要。改用模板。 我认为这是编译时的事情。当遇到启动时,例如“MyTemplate看这篇文章,最后一行对泛型的引用指定泛型在 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 中的泛型一样工作。
【讨论】:
请记住,C++/CX 与 C++/CLI 不同 - Windows 运行时与 CLR 不同,并且 CLR 中存在 winrt 不支持的功能。你不能假设 CLR 功能可以在 C++/CX winrt 应用程序中工作【参考方案2】:据我所知,不支持任意 C++/CX 泛型。 C++/CX 可以使用 winrt 参数化接口,这些接口显示为 C++ 模板特化,但不能导出任意泛型。
您可以从 Windows::Foundation 命名空间创建参数化接口的特化,但不能创建原始参数化接口(公共引用模板)。
【讨论】:
是的,第二段是真的。以上是关于泛型在 C++/CX 中的工作原理的主要内容,如果未能解决你的问题,请参考以下文章