具有自定义枚举的C ++类

时间:2016-06-10 06:34:02

标签: c++ enums

首先,英语不是我的第一语言。如果您需要解释更多的东西,请询问。

我想做的是创建一个扩展枚举使用的类。说你有

enum Color 
{ red,
  green, 
  blue };

我想创建一个类,所以我可以创建一个像

这样的对象
CustomEnum myEnum("red", 
                  "green", 
                  "blue", 
                  "The house is red", 
                  "The tree is green", 
                  "The car is blue");

这样,我可以打电话给

myEnum.getString(red);

使用自定义函数,它将返回“房子为红色”的映射值。但是我有很多我想写的函数,并且有许多枚举。

CustomEnum mySecondEnum("pizza", 
                  "soup", 
                  "eggs", 
                  "burger", 
                  "The pizza is hot", 
                  "The soup has gone cold", 
                  "The eggs are bad",
                  "The burger has cheese");

请注意,两个枚举的大小不同,但CustomEnum并不关心。

我已经做了大量的谷歌搜索,并提出要么这不能做(因为枚举是在编译时制作的),或者我在谷歌搜索错误的东西。在这一点上,我想确认这是不可能的,或者有人可以指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

鉴于你......

enum Colour { red, green, blue };

您可以创建单独的映射:

std::map<Colour, std::string> colour_strings = {
    { red, "red" }, { green, "green" }, { blue, "blue" }
    // or if you like...
    { red, "The house is red" }, { green, "The tree is green" },
    { blue, "The car is blue" }
};

然后,您可以在代码中查找字符串:

Colour my_colour = green;
std::cout << colour_strings[my_colour] << '\n';

有各种各样的&#34;技巧&#34; C ++开发人员用来简化这一过程,包括:

#define X(NAME) { NAME, #NAME }

std::map<Colour, std::string> colour_strings = {
    X(red), X(green), X(blue)
};

...和...

  

colours.h

X(red)
X(green)
X(blue)
  

the_app.cc

// include once to create enum itself...
#define X(IDN) IDN,
enum Colours {
#include "colours.h"
    something_for_after_last_comma
};

// include again to create colour string mappings...
#define X(IDN) { IDN, #IDN }
std::map<Colour, std::string> colour_strings = {
#include "colours.h"
};