Обеспечивает ли C ++ / WinRT отображение символа enum на имя строки? - PullRequest
0 голосов
/ 29 января 2019

Я использую 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, а также объяснение «Версия адаптивного кода».Я надеялся, что интерфейс ОС COM, стоящий за ApiInformation, сможет запросить имя для перечисления, но я не смог найти ответ там.https://docs.microsoft.com/en-us/uwp/api/Windows.Foundation.Metadata.ApiInformation

...