C++/WinRT 是否提供辅助函数来从字符串文字构造 GUID?

Does C++/WinRT offer a helper function to construct a GUID from a string literal?

与 C++/CX 不同,C++/WinRT 中似乎没有 GUID 的包装器类型。它只使用普通的 C GUID struct as-is. So the only way to construct an initialized GUID is by using 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 函数.浏览 documentationwinrt/base.h,我没有发现任何立即适用的内容。

C++/WinRT 是否提供辅助函数以在编译时从字符串文字构造 GUID?如果没有,可以we/I有一个吗?

不,C++/WinRT 目前不提供这样的帮助程序。最初编写 constexpr GUID 代码时,C++ 编译器对 constexpr 的支持相当脆弱且缓慢。因此,我避免了任何不必要的计算。然而,constexpr 支持有了很大改进。无论如何,constexpr make_guid 函数对于足够高级的编译器是可行的。这是一个例子:

https://gist.github.com/kennykerr/6c948882de395c25b3218ad8d4daf362

肯尼的回答很有帮助。我只是在 Windows 10 SDK 中对 GUID 添加一点更新。

自 Windows 10 版本 1809 起,GUID 已被投影为“winrt::guid”。它现在是 C++/WinRT 中的基本类型。这里是 release note on Docs.

此外,还有一个从空构建 GUID 的助手。请参考下面的link: https://docs.microsoft.com/en-us/uwp/api/windows.foundation.guidhelper.createnewguid?view=winrt-19041