首页 > 解决方案 > 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

标签: c++-winrt

解决方案


这个怎么样

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));
        }
    }
}

推荐阅读