C++/CX中的泛型如何工作

8
我在互联网上没有找到有关此事的任何信息,因此我正在寻找了解C++/CX实现方式的人。 C++/CX的维基百科文章称它支持基于运行时的泛型,这意味着您不需要具有完整实现的头文件即可实例化泛型类型。我知道这对于.NET来说是如何工作的(程序集包含IL代码,JIT可以直接将具体类型插入其中,并在有新实例化时编译它),但在C++/CX中(它是本地编译的),没有JIT来在运行时编辑代码(我认为这对x86机器码来说可能很难)。
那么这里的技巧是什么,是使用盒式装箱的类型抹除还是一些新的人为方案?
(我知道有关类型的元数据以.NET格式存储,我想了解方法中的代码)

5
闻起来像是Java中“将所有东西都强制转换为Object,然后再转回去”的泛型方法。 - Cat Plus Plus
一个基于运行时的泛型就是。C++ 的泛型类型擦除是 boost::any,但如果您不需要,则不应该使用运行时泛型,而大多数人永远不需要使用它。应改用模板。 - Mooing Duck
2
我认为这是编译时的事情。当遇到一个初始化,比如 "MyTemplate<RealType> obj;",编译器将使用 "MyTemplate" 和 "RealType" 生成具体类定义的副本,然后使用它来创建对象。在编译后就没有模板的东西了。 - Lyn
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++/CLI中没有通用类,通用接口和委托支持是实际上像C++/CLI中的通用类那样工作的。

2
请记住,C++/CX不同于C++/CLI——Windows运行时与CLR不同,并且CLR中的某些功能在winrt中不受支持。您不能假设CLR功能将在C++/CX winrt应用程序中起作用。 - Larry Osterman

3
据我所知,C++/CX不支持任意的泛型。C++/CX可以使用winrt参数化接口,这些接口显示为C++模板特化,但无法导出任意泛型。
您可以从Windows::Foundation命名空间创建参数化接口的特化版本,但不能创建原始参数化接口(public ref templates)。

是的,第二段是正确的。 - Larry Osterman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接