c++ - 初始化枚举索引数组?

标签 c++ arrays gcc enums g++

gcc 在 C 中有一个非常好的扩展,允许您使用枚举作为键将数据保存在数组中:

 enum keys
 {
      key_alpha = 0,
      key_beta = 1,
      key_gamma = 2
 };

 ValType values = 
 {
      [ key_alpha ] = { 0x03b1,"alpha" },
      [ key_gamma ] = { 0x03b3,"gamma" },
      [ key_beta ]  = { 0x03b2,"beta" }
 };

这很好,因为如果必须更改列表,添加或删除一行不会破坏分配,很明显哪个键对应于哪个值,并且导致简单代码与普通标准数组初始化没有区别。

不幸的是,这个扩展在 g++ 中不可用。

在 C++ 中执行相同操作的首选轻量级方法是什么?最好不要基于 之类使用字符串键、隐藏索引、繁重模板或其他 CPU 和内存繁重的东西?

最佳答案

#include <iostream>

#define KEYS_DEF \
    KEY_DEF( alpha, 0x03b1, "alpha" ),  \
    KEY_DEF( beta,  0x03b2, "beta" ),   \
    KEY_DEF( gamma, 0x03b3, "gamma" )

#define KEY_DEF( identifier, id, name )  identifier
enum keys { KEYS_DEF };

#undef KEY_DEF
#define KEY_DEF( identifier, id, name )  { id, name }
struct ValType { int id; char const* name; };
ValType const values[] = { KEYS_DEF };

int main()
{
    using namespace std;
    for( int i = alpha;  i <= gamma;  ++i )
    {
        cout << values[i].name << endl;
    }
}

关于c++ - 初始化枚举索引数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8167086/

相关文章:

c++ - Windows/C++ : how can I get a useful stack trace from a signal handler?

c# - 将字节数组转换为位数组问题

c - 如何创建匹配来自不同文件夹的文件的 rake 规则?

c++ - Boost.Graph 如何合并两个顶点/契约(Contract)边

c++ - 用于渲染不同对象的 VAO 和 VBO

c++ - 如何调用类的默认构造函数,其构造函数由具有所有默认参数的 ctor 提供?

arrays - GCC:数组类型具有不完整的元素类型

php - 如何使用数组进行字符串循环?

javascript - 另一种获取数组 Javascript 整数的所有组合的方法

c - 如何避免 gcc 编译器使用 -l 选项?