Как создать перечисление c ++ из стиля C #define и struct (или как правильно это сделать)? - PullRequest
0 голосов
/ 31 октября 2019

Я работаю с библиотекой C ( Raylib ), которая использует следующее для представления цвета:

#define RED        { 230, 41, 55, 255 }

// Color type, RGBA (32bit)
typedef struct Color {
  unsigned char r;
  unsigned char g;
  unsigned char b;
  unsigned char a;
} Color;

Я хочу определить перечисление всех Color объектовкоторый я буду использовать в своей палитре в своем коде C++.

Но enum class допускает только целые виды значений. Каков наилучший способ иметь фиксированный статический набор значений, которые не являются целочисленными?

Один из подходов, который я имею в виду, - это просто объявить static constexpr значения в struct. Это правильный подход?

struct Color {
  constexpr static auto MYRED = RED;
  constexpr static auto MYBLUE = BLUE;
  constexpr static auto MYGREEN = GREEN;
};

1 Ответ

2 голосов
/ 31 октября 2019
namespace RayLib {
  using Color = ::Color;
  inline constexpr Color Red = RED;
  inline constexpr Color Blue = BLUE;
  inline constexpr Color Green = GREEN;
}

- это то, как я бы это сделал.

Вы также можете захотеть:

namespace MyApp {
  inline constexpr std::array Palette = {
    RayLib::Red,
    RayLib::Blue,
    RayLib::Green,
    RayLib::Fuscia
  };
}

, где MyApp - это пространство имен, которое вы используете для кода приложения (вв этом случае палитра, которую вы используете в своем приложении). (Извиняюсь, если я не понял синтаксис вычетов прямо выше)

...