c++-winrt - C++/WinRT 是否提供从枚举符号到字符串名称的映射?
问题描述
我正在使用 C++/WinRT。投影包括许多枚举。我发现自己正在为字符串文字构建自己的枚举值表。对于只有几个定义值的枚举来说,这并不是什么大问题,但是当它们有很多时,这会很痛苦。
我真正想要的是某种形式的编译时或运行时反射,它将枚举值转换为表示给定枚举值的编译时名称的字符串表示形式。下面的代码片段演示。如何实现自动化?
std::wostream& operator<< (
std::wostream& wout,
winrt::Windows::Graphics::DirectX::DirectXPixelFormat e)
{
// https://docs.microsoft.com/en-us/uwp/api/windows.graphics.directx.directxpixelformat
using winrt::Windows::Graphics::DirectX::DirectXPixelFormat;
switch (e) {
case DirectXPixelFormat::R8G8B8A8Int:
wout << L"R8G8B8A8Int";
break;
case DirectXPixelFormat::B8G8R8A8UIntNormalized:
wout << L"B8G8R8A8UIntNormalized";
break;
default:
// TODO: Many enums cases are missing.
// Find a way to compile-time-generate the string values from enum value.
wout << L"Unknown (" << std::to_wstring(static_cast<int32_t>(e)) << L")";
}
return wout;
}
我可以构建一些东西来解析 winrt/*.h 文件以生成包含字符串文字数组的标头,然后 #include 生成的标头。可能存在用于执行与 C++/WinRT 无关的此类事情的示例代码。但也许 C++/WinRT 在 SDK 中包含元数据,它与 C++/WinRT 命令行工具之一相结合,可以轻松地为我做到这一点?如果它在那里,我还没有找到它。
我确实ApiInformation
从 winrt/Windows.Foundation.Metadata.h 中找到了接口,以及“版本自适应代码”的解释。我曾希望后面的 OS COM 接口ApiInformation
可以查询枚举值的名称,但我无法在那里找到答案。
https://docs.microsoft.com/en-us/uwp/api/Windows.Foundation.Metadata.ApiInformation
解决方案
这个怎么样
https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/move-to-winrt-from-cx#tostring
namespace winrt
{
hstring to_hstring(StatusEnum status)
{
switch (status)
{
case StatusEnum::Success: return L"Success";
case StatusEnum::AccessDenied: return L"AccessDenied";
case StatusEnum::DisabledByPolicy: return L"DisabledByPolicy";
default: return to_hstring(static_cast<int>(status));
}
}
}
推荐阅读
- javascript - Node.js / javascript minhash 模块,为相似的文本输出相似的哈希字符串
- python - Python:为什么在scrapy crawlspider中没有打印或做任何事情?
- sql - SQL 获取本年度直到前一周星期五的数据
- docker - 启动失败,ddev-router 无法准备好,复制上游
- python - 来自同一模型的 Django 两个 ForeignKey
- python - 在 QStackedWidget 对象内定位内部小部件
- sqlite - 为矩阵创建sql表并将csv文件插入表中
- github - 如何在 Github 上更新拉取请求
- javascript - Sequelize:使用函数添加默认范围
- security - 如何允许具有内容安全策略 (CSP) 的 iframe