C++:是否有一种简单的方法 'mapping' 将十六进制颜色 `0xff2a2620` 转换为更具可读性的字符串 'lovelyBrown'?

C++: Is there a simple way of 'mapping' the hex colour `0xff2a2620` to a more readable string 'lovelyBrown'?

我正在使用具有 setColour 方法的 Juce Framework,如下所示:

g.setColour (Colour (0xff2a2620));

相反,我想写一些更易读的东西,比如:

g.setColour (Colour (lovelyBrown));, 'mapping' 0xff2a2620 至 'lovelyBrown'.

方法原型为:

explicit Colour (uint32 argb) noexcept; 其中 uint32 是:

/** A platform-independent 32-bit unsigned integer type. */ typedef unsigned int uint32;

Juce 已经有了很好读的颜色名称,例如:

const Colour Colours::tomato (0xffff6347);,使用给定名称查找颜色的方法:

static JUCE_API Colour findColourForName (const String& colourName, const Colour& defaultColour);

但是,我不想修改或子class他们的颜色class。我想知道是否有更简单的方法 'mapping' 0xff2a2620 到 'lovelyBrown'?

enum MyColour {
lovelyBrown = 0xff2a2620,
};

这行得通,但我最终听从了 Tony 的建议,寻求更清洁(更简单!)的解决方案。查看他的回答

使用 C++11 枚举(这样你的枚举将是一个 uint32_t):

#include <cstdint>
enum class Colours : std::uint32_t {
    lovelyBrown = 0xff2a2620,
    lovelyOther = 0xff2a26FF
};

就像你说的 Juce 提供...

const Colour Colours::tomato (0xffff6347);

...您可以添加自己的颜色:

const Colour lovelyBrown (0xff2a2620);

如果您希望函数在运行时将颜色名称映射到值,一个简单而可靠的方法是:

std::map<std::string, Colour> colourMap;
colourMap["lovelyBrown"] = lovelyBrown;
// add more here...

一个稍快的替代方法是使用连续数组或 vector 排序的颜色名称并使用 lower_bound 进行搜索。如果您不确定该怎么做,您可能不应该...;-P。 (您需要信任 yourself/others 来保持源代码中的列表排序,或者在首次使用前进行运行时排序,因此分别有更多的 risk/hassle+ 去本地化)。


注:

  • 使用 enum class Colours 的一个问题是,当您使用包含的颜色名称时,它们 必须 Colours:: 为前缀,因此与Juce 提供的颜色名称:
    g.setColour (Colour (tomato));  // ok for provided colours
    g.setColour (Colour (Colours::lovelyBrown));  // oops, one of yours
  • 更一般地说,使用 enumenum class 使颜色成为一种独特的类型,这会产生微妙的后果:例如你不能在不编写自己的 operator<< 的情况下将它们按 cout << lovelyBrown 流式传输,你不能按 lovelyBrown ^ 0xFF0000 等反转红色组件 - 同样,这些事情可以为Juce 提供的颜色。