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
- 更一般地说,使用
enum
或 enum class
使颜色成为一种独特的类型,这会产生微妙的后果:例如你不能在不编写自己的 operator<<
的情况下将它们按 cout << lovelyBrown
流式传输,你不能按 lovelyBrown ^ 0xFF0000
等反转红色组件 - 同样,这些事情可以为Juce 提供的颜色。
我正在使用具有 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
- 更一般地说,使用
enum
或enum class
使颜色成为一种独特的类型,这会产生微妙的后果:例如你不能在不编写自己的operator<<
的情况下将它们按cout << lovelyBrown
流式传输,你不能按lovelyBrown ^ 0xFF0000
等反转红色组件 - 同样,这些事情可以为Juce 提供的颜色。