gpt4 book ai didi

c++ - C/C++ : any way to get reflective enums?

转载 作者:IT老高 更新时间:2023-10-28 22:06:33 25 4
gpt4 key购买 nike

这种情况我遇到过很多次了……

 enum Fruit {
Apple,
Banana,
Pear,
Tomato
};

现在我有 Fruit f;//香蕉 我想从 f 转到字符串 "Banana";或者我有 string s = "Banana" 并且我想从中转到 Banana//枚举值或 int

到目前为止,我一直在这样做。假设枚举在 Fruit.h 中:

// Fruit.cpp
const char *Fruits[] = {
"Apple",
"Banana",
"Pear",
"Tomato",
NULL
};

显然这是一个困惑的解决方案。如果开发人员在标题中添加了一个新水果,但没有在 Fruits[] 中添加一个新条目(不能怪他,它们必须在两个不同的文件中!)应用程序就会繁荣起来。

有没有一种简单的方法来做我想做的事,所有东西都在一个文件中?预处理器黑客,外星魔法,任何东西..

PS:这与“针对一切”的反射相反,在编译器中实现起来真的很简单。看到这是一个多么普遍的问题(至少对我来说),我真的不敢相信没有 reflective enum Fruit.. 甚至在 C++0x 中也没有。

PS2:我使用的是 C++,但我也将这个问题标记为 C,因为 C 也有同样的问题。如果你的解决方案只包含 C++ 的东西,那对我来说没问题。

最佳答案

这需要在外部文件中定义水果。这将是 fruit.cpp 的内容:

#define FRUIT(name) name
enum Fruit {
#include "fruit-defs.h"
NUM_FRUITS
};
#undef FRUIT
#define FRUIT(name) #name
const char *Fruits [] = {
#include "fruit-defs.h"
NULL
};
#undef FRUIT

这将是 fruit-defs.h:

FRUIT(Banana),
FRUIT(Apple),
FRUIT(Pear),
FRUIT(Tomato),

只要值从 0 开始并且是连续的,它就可以工作...

更新:如果您需要非连续值,请将此解决方案与 Richard Pennington 使用 C99 提供的解决方案混合。即,类似:

// This would be in fruit-defs.h
FRUIT(Banana, 7)
...
// This one for the enum
#define FRUIT(name, number) name = number
....
// This one for the char *[]
#define FRUIT(name, number) [number] = #name

关于c++ - C/C++ : any way to get reflective enums?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1801363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com