【发布时间】:2019-06-22 16:52:36
【问题描述】:
我正在使用 C++/WinRT。投影包括许多枚举。我发现自己正在为字符串文字构建自己的枚举值表。对于只有几个定义值的枚举来说,这没什么大不了的,但是当它们有很多时,这会很痛苦。
我真正想要的是某种形式的编译时或运行时反射,它将枚举值转换为表示给定枚举值的编译时名称的字符串表示形式。下面的代码 sn-p 演示了。如何实现自动化?
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 命令行工具之一相结合,可以轻松地为我做到这一点?如果它在那里,我还没有找到它。
我确实从 winrt/Windows.Foundation.Metadata.h 中找到了ApiInformation 接口,以及“版本自适应代码”的解释。我曾希望ApiInformation 后面的 OS COM 接口可以查询枚举值的名称,但我无法在那里找到答案。
https://docs.microsoft.com/en-us/uwp/api/Windows.Foundation.Metadata.ApiInformation
【问题讨论】:
-
C++/WinRT是标准的C++17,C++17没有反射。
-
明白。但是 winrt/ 中的标头似乎是由微软编写的工具生成的。该工具有答案。如果驱动该工具的元数据可用,那么 winrt/ 中的枚举可能存在一个简单的答案
-
工具在这里:github.com/Microsoft/xlang - 枚举值的字符串化不符合 C++ 的精神。在实践中,字符串化仅用于记录目的,与这样做的人的讨论表明他们通常会后悔并希望他们以纯整数形式记录。部分原因是在后端解析整数更容易。 (否则,您的后端要么需要反向解析器,要么需要处理所有表示相同含义的不同字符串。)
-
ApiInformation 不会得到你想要的。该课程的目的是点亮。 “如果这个操作系统支持 DirectXPixelFormat::B8G8R8A8UIntNormalized,我会用它。”
-
谢谢,我去看看 xlang。对枚举值执行操作的代码不会使用字符串化的枚举名称。我需要为诊断工具进行字符串化,其中字符串化枚举名称的消费者将是人的眼睛。诊断工具将当前系统状态转储到标准输出。人类理解枚举名称,而不是数值,尤其是对于像 DX 像素格式这样的东西。
标签: c++-winrt