Я использую 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