2016-06-10 106 views
0

第一个英语不是我的第一语言。如果你需要解释更多的东西,请问。具有自定义枚举的C++类

我想做的是做一个扩展enum的使用的类。假设你有

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并不在意。

我已经做了大量的谷歌搜索,想出了这是不能做到的(因为枚举是在编译时),或者我用google搜索错误的东西。在这一点上,我想确认这是不可能完成的,或者如果有人能指出我正确的方向。

+4

你为什么不只是使用'std :: map'? – CinCout

+0

其他愚蠢:[如何将枚举类型变量转换为字符串?](http://stackoverflow.com/q/5093460/514235)... Q的前提有问题。显然,你想有一个'CustomEnum'并且将所有的枚举类型,比如'Color','Food'等组合到那个中。但是,你要如何检查'red'和'pizza'是否不一样。因此,对于每个枚举类型,您可能需要单独的'std :: map'。为此,你可以参考链接和以上的骗局。 – iammilind

回答

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'; 

有一个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" 
}; 
+0

要迂腐,我要么'color_strings'作为'const'或不使用'operator []'。因为OP可能不希望创建一个空字符串,所以当某些'enum'值没有明确地映射到[un]时。另外'Color'作为'std :: map'的关键字是不对的,因为OP期望'pizza'等。如果'pizza'和'red'发生碰撞,那么将会使整个结构失效。所以这个问题本身的信息较少。 – iammilind

+0

@iammilind:使'colour_strings''const'可以防止使用operator []',所以如果程序不能被信任有效的枚举,那么就不能直接使用map到'const char * str(Color)'可能会更好,我倾向于为'enum'类型实现一个'operator <<',它也允许词法转换......很快变得复杂,但我想我所提供的对于学习者提出这个问题是合理的。 “颜色”作为一个关键是不正确的“ - 问题显示”CustomEnum“引用”红色“,但作为客户端使用”myEnum.getString(红色);'所以谁知道? –

+0

枚举当然可以具有相同的值,以防止它们用作键,并且枚举可以接受与枚举标识符不匹配的值(例如,通常是值的按位或值) - 并不是说​​这适用于所有枚举。 –