【发布时间】:2021-04-08 22:35:55
【问题描述】:
与 C++/CX 不同,C++/WinRT 中似乎没有 GUID 的包装器类型。它只是按原样使用普通的 C GUID struct。所以构造初始化 GUID 的唯一方法是使用 aggregate initialization 语法,例如
GUID const guid{ 0x00000000, 0x0000, 0x0000,{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } };
虽然可行(并且 Visual Studio 中的 Create GUID 工具甚至可以设置为为您生成初始化程序代码),但它只是乏味、难以阅读,而且总是让我摸不着头脑我介绍了任何字节序问题。
我更喜欢写作(使用假设的make_guid 函数)
auto const guid{ make_guid("00000000-0000-0000-0000-000000000000") };
我知道 C++/WinRT 使用了很多 constexpr 魔法来根据完全限定的类型名称计算 GUID,因此大概可以实现零开销编译时间 make_guid 函数。浏览 documentation 和 winrt/base.h,我没有发现任何立即适用的内容。
C++/WinRT 是否提供帮助函数以在编译时从字符串文字构造 GUID?如果没有,我们/我可以拥有一个吗?
【问题讨论】:
-
旧的
__uuidof()扩展仍然存在,在 base.h 中被 guid 模板使用。您只需要__declspec(uuid("yadayada"))告诉编译器它。如有必要,伪造一个结构。 -
有一个例子right here.
-
@HansPassant:这不构成
GUID。它将GUID附加到一个类型,可以使用__uuidof进行检索。这比使用聚合初始化更加冗长,并且引入了假类型。不完全是我想要的。 -
确实如此,使用 guid 来检索它。如果您可以正确声明类型并推荐使用,那就太好了。但肯定没有必要,任何结构都可以。顺便说一句,你很挑剔。
-
开发人员时间的第一大时间槽是阅读代码。对其他人必须阅读的代码进行挑剔是一项合理的投资。在这种特定情况下,在生成实现时似乎没有任何未解决的问题,简洁地传达了意图。另一方面,伪造类型实现了相反的效果:它引入了代码(其他人必须阅读),这对解决方案没有帮助。
标签: c++-winrt