Это псевдоним для vk::Flags
, который является шаблоном для работы с битовыми полями Vulkan в типобезопасном поместье.
Вы хотите, чтобы перечисления были безопасными для типов; Вы не хотите неявных преобразований в / из целых чисел. Поэтому в C ++ вы делаете это, определяя перечисление как enum class
.
Это нормально для регулярных перечислений. Но битовые поля особенные; они комбинации перечислителей из конкретного перечисления. Типичное решение после C ++ 11 - просто дать перегруженные операторы типа перечисления, чтобы вы могли применять &
и |
к самому типу перечисления.
Лично это решение всегда меня терло. На мой взгляд, сильный тип перечисления должен содержать один значений перечисления, а не несколько из них. Поэтому использование перегрузки операторов для эффективного допуска значения перечисления ложь меня не устраивало.
Очевидно, я не одинок в этом, потому что авторы vulkan.hpp
выбрали другое решение. Они создали шаблон класса vk::Flags
, который принимает два параметра шаблона. Одним из них является перечисление, которое содержит все допустимые битовые флаги. Второй параметр - это «перечисление», которое представляет объединение нескольких флагов. Это то, что на самом деле понимает файл спецификации vulkan.xml: разница между полем, содержащим возможные биты, и полем, которое представляет собой совокупность битов.
vk::Flags
могут быть заданы биты из битового поля, и вы можете манипулировать им битами из этого битового поля с помощью некоторых побитовых операторов. И он неявно преобразуется в тип, представляющий агрегацию битов.
Так что DeviceQueueCreateInfo
это просто псевдоним для Flags<DeviceQueueCreateFlagBits, VkDeviceQueueCreateFlags>
, который является битовым полем, которое принимает биты создания устройства и объединяет их в совокупность флагов.