2017-09-26 51 views
0

我已经搜索过但找不到此问题的任何解决方案。 我有一个枚举不以“0”开始,其他值也没有先后顺序这就好比,如何在C/C++中获取Enum中的值索引

typedef enum{ 
a = 8, 
b = 100, 
c, 
d = 1, 
e = 9 
}numberEnum; 

我想获得一个元素的索引在这样的枚举;

int myIndex = getIndex(a); // myIndex = 0 
int myIndex1 = getIndex(d); // myIndex1 = 3 
int myIndex2 = getIndex(b); // myIndex2 = 1 

int getIndex(numberEnum e) 
{ 
    // some code here 

    return index; 
} 

我不应该在这种情况下使用Array。使用枚举是必须的。有什么办法可以做到这一点? 感谢您的帮助。

+3

有这样做的直接方式。但是这里的目标是什么?你是否希望在编译时使用这些信息? –

+2

这里可以做的不多。你可以维护一个单独的列表索引列表(也许'std :: map ',假设C++),或者使用x-macros(或boost预处理器witchery)自动生成这个列表。在没有数组的情况下做这件事很愚蠢,但是你可以用x-macro或类似的东西生成一个'switch'。 – HolyBlackCat

+4

C或C++?他们不是相同的语言,解决方案会有所不同。 – Barmar

回答

3

统计员没有“索引值”。所以这不是你可以查询的东西,也不是你所期望的。这两个枚举在功能上等同:

enum alpha { first, second }; 
enum beta { second = 1, first = 0 }; 

我敢肯定,你可以做一些宏观的东西来从枚举名到他们在枚举列出的顺序数组映射。但是这需要将枚举和枚举器包含在宏中。

2

您必须手动进行此关联,就像这样:

int getIndex(numberEnum e) 
{ 
    switch(e) 
    { 
     case a: 
      return 0; 
     case b: 
      return 1; 
     default: 
      return -1; 
    } 
} 
+0

如果要求是您不能将订单存储在数组中,则这是一种选择。 – drescherjm

1

还有就是要“索引枚举”没有任何语义的含义,它是不是一个数据结构或数组,而是一个数据类型,没有订单,因为枚举的大小是单个值的大小 - “索引”没有意义。这是问如何索引一个整数;即所有枚举都是一个带有定义子集的整数(如果有效值)。

可以使用值的常量阵列,通过枚举指数或许实现你想要的(虽然这样做的原因我想不起来了)它:

static const int values[] = {8, 100, 101, 1, 9} ; 
typedef enum { a, b, c, d, e } numberEnum ; 

numberEnum myIndex = a ; // myIndex = 0 
numberEnum myIndex1 = d; // myIndex1 = 3 
numberEnum myIndex2 = b; // myIndex2 = 1 

int myValue = values[myIndex] ; 
int mValue1 = values[myIndex1] ; 
int mValue2 = values[myIndex2] ; 

int valueC = values[c] ; 
+0

现在,这是有道理的。 – drescherjm

0

如果你是在一个丑陋的真正兴趣解决方案使用tamplates:

#include <iostream> 
#define MAPENUM(x,y) template<> struct EV<x> { static const int value=y; }; 

typedef enum{ 
a = 8, 
b = 100, 
c, 
d = 1, 
e = 9 
}numberEnum; 

template<numberEnum> struct EV { static const int value=-1; }; 

MAPENUM(a,1) MAPENUM(b,2) MAPENUM(c,3) MAPENUM(d,4) MAPENUM(e,5) 

template<numberEnum n> 
int getIndex() { 
    return EV<n>::value; 
} 

int main() { 
    std::cout << getIndex<b>() <<std::endl; 
    std::cout << getIndex<e>() <<std::endl; 
    std::cout << getIndex<d>() <<std::endl; 
    return 0; 
} 

live example