WinRT真的可以仅在边界使用吗?


15

Microsoft(主要是Herb Sutter)建议在将WinRT与C ++ / CX一起使用时,将WinRT保留在应用程序的边界,并保持应用程序的核心使用标准ISO C ++编写。

我一直在编写一个我想使其保持可移植性的应用程序,所以我的核心功能是用标准C ++编写的,现在我正尝试使用C ++ / CX为其编写Metro风格的前端。但是,我对这种方法有一些疑问。例如,如果要将用户定义的C ++类型的向量推入XAML ListView控件,则必须将用户定义的类型包装为WinRT引用/值类型,以将其存储在中Vector^。通过这种方法,我不可避免地要用WinRT类包装大部分C ++类。

这是我第一次尝试用C ++编写可移植的本机应用程序。保持WinRT这样的界限真的可行吗?带有平台特定边界的这种类型的便携式内核又将如何处理?


像MVVM,其中Model是标准C ++,V和VM是WinRT互操作对象吗?
马克斯

5
“但是每个虚拟机实际上都变成了我的标准模型的包装器。” -在任何情况下,视图模型都是很常见的。
MattDavey 2012年

1
@ GlenH7,我相信评论大部分已经为我解答了。我得出了相同的结论,但是希望有人想到一个更聪明的主意。总的来说,事情就是这样。您可以尽最大努力隔离部分代码,但是在大多数情况下,您最终将需要重写特定于平台的代码部分(例如,在上面的ViewModel示例中)。
Bret Kuhns 2012年

1
@ GlenH7也许使应用程序代码在各个平台之间保持一致的唯一方法是编写自己的平台抽象层,但是这些层最终将是我最初试图避免的层。它只是通过层抽象来解决问题,从而隔离问题。也许有帮助,但是最后您仍然在做这项工作。
Bret Kuhns 2012年

1
我们曾经尝试创建一个“银色子弹”,以将C库无缝地粘合到Android上的Java。最后,在花了大约10倍以上的时间并使用奇异的调试技术(以解决边界上的异常行为)后,它可以工作。当然,这很有趣。
亚历克斯·科恩

Answers:


8

恕我直言(老程序员;在Microsoft工作,但这是个人观点):在我可以回答这个问题之前,您必须回答另一个问题:

代码要移到哪里?如果您使用的是单一平台(在本例中为WinRT),则应靠近该平台-这意味着要使用现有的抽象。按照您的示例,您的代码将使用Vector ^来满足WinRT的需求。

OTOH,如果您要搬到其他地方(VMS太糟糕了!),那么基于标准的做法就很有意义。

鉴于市场上三个最大的类似平板电脑的便携式平台都使用不同的语言来执行常见的编程任务,因此移动代码可能不是一个有价值的选择。


我同意。我启动了针对WinRT的项目,但是知道Android / iOS将是吸引人的平台,这引发了这个问题。从那以后,我决定只针对WinRT编写。如果项目本身引起了人们的注意,那么我将担心移植(或者改写到另一个平台)。
Bret Kuhns 2012年

正如@alexcohn所指出的那样,如果我决定跨平台使用时,如果核心功能足够强大,那么值得将具有平台特定层的可移植代码包装起来。否则,我将重写代码并使用测试套件来验证跨不同平台(在适当情况下)的行为。
Bret Kuhns 2012年

0

您不必使用C ++ / CX,而可以使用WRL(Windows运行时库),它类似于旧的ATL模板,而不是“假装”的C ++ / CX。它是从MS到使用WinRT对象的“低级”方法,并且是完全标准的C ++,例如Grandad曾经编写的!

它可能不像C ++ / CX那样“好”,但这是一个见解的问题-我个人的观点是C ++ / CX是扩展C ++的第三次尝试,并且是第三次失败。忽略它,希望它与其他两个化身一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.