如何求枚举类型定义中枚举值的个数?

xueweizhong 2005-04-22 03:32:24
比如
enum aaa {A, B, C};
enum a { D};

求算法enum_size使:

aaa |--> 3
a |--> 1

要求不能修改枚举类型的定义,不能给枚举类型的定义加上特殊限制,比如:
而且对任何枚举类型都有效的方式。

一般情况下enum_size是一个模板类:
template <typename Enum_type>
struct enum_size
{
enum { value = .... }
};

或者其他实现方式。
比如
template <typename E>
size_t enum_size(E e)
{
}

虽然写成函数形式,但只依赖于类型不同才会返回不同的值。

已有的感觉好像是不太可能。
不过还是来征求一下大家的意见。
...全文
1376 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
flying_dancing 2005-04-22
  • 打赏
  • 举报
回复
哇 这次是程序看不明白了
完了 完完了
diandian82 2005-04-22
  • 打赏
  • 举报
回复
关注。。。
daidodo 2005-04-22
  • 打赏
  • 举报
回复
看不出这个问题有什么实用价值。
277894613 2005-04-22
  • 打赏
  • 举报
回复
说的都很好!
xueweizhong 2005-04-22
  • 打赏
  • 举报
回复
都是些新朋友。好久不来,斑竹也换新的了。呵呵。
tiaoci 2005-04-22
  • 打赏
  • 举报
回复
另外既然是 枚举,那就根本没有必要使用 设定值

否则就使用常数好了
tiaoci 2005-04-22
  • 打赏
  • 举报
回复
你这样做也是有问题的,

因为枚举不可能定义在一个地方的,

分布在多个文件中的enum你让人定义到一个 table

显然不合适
tiaoci 2005-04-22
  • 打赏
  • 举报
回复
to BrandyCao, c 本来就不擅长做这种东西

我这也是没有办法的办法,

还是.NET好,把所有对象模型全部当Metadata来处理

如果真要取得enum的纪录数那就只能把enum的Metadata存起来了
dongpy 2005-04-22
  • 打赏
  • 举报
回复
关注
BrandyCao 2005-04-22
  • 打赏
  • 举报
回复
To tiaoci(我挑刺,我快乐) :
你那样只对递增的enum才有效,
但对如下的enum就无效了:
enum aaa { A = '1' , B = 2 , C = 1 };
shazi_pig 2005-04-22
  • 打赏
  • 举报
回复
mark!
BrandyCao 2005-04-22
  • 打赏
  • 举报
回复
其实enum就是定义一些常量而已,就象define一样,只不过加上了类型的限制! 所以基本无法实现!

不过下面这个方法可以变相的实现:
#include <iostream>
#include <stdlib.h>

using namespace std;

#define ENUMITEM(name , len) { name , len } ,
#define ENUMITEMEND() { "" , "" }

enum aaa { A = '1' , B = 3 , C = 5 };
enum aa { D = '1' };

char* table[][2] =
{
ENUMITEM("aaa" , "3")
ENUMITEM("aa" , "1")
ENUMITEMEND()
};

int GetEnumLen(char* szEnumName)
{
int i = 0;

for(; ; i++)
{
if( strcmp(table[i][0] , "") == 0 )
break;
if( strcmp(table[i][0] , szEnumName) == 0 )
return atoi(table[i][1]);
}

return -1;
};

void main()
{
cout << GetEnumLen("aaa") << endl;
}

这样每次增加或修改enum的时候,只要修改table表即可!
tiaoci 2005-04-22
  • 打赏
  • 举报
回复
第一次使用 enum,嘿嘿,

发现竟然不能适用限定( Enum1.a, Enum1.b )

只好使用连接 ##
tiaoci 2005-04-22
  • 打赏
  • 举报
回复
按固定的规则做就能得到结果
tiaoci 2005-04-22
  • 打赏
  • 举报
回复
#include <stdio.h>

#define ENUM_START(name) enum name { name##_##FIRST,
#define ENUM_END(name) name##_##LAST}
#define ENUM_SIZE(name) ((name##_##LAST) - (name##_##FIRST) - 1)

ENUM_START(Enum1)
a,
b,
c,
ENUM_END(Enum1);

ENUM_START(Enum2)
d,
e,
ENUM_END(Enum2);


int main()
{
printf("%d\n", ENUM_SIZE(Enum1));
printf("%d\n", ENUM_SIZE(Enum2));
}
xjp6688 2005-04-22
  • 打赏
  • 举报
回复
不清楚
听海拉拉 2005-04-22
  • 打赏
  • 举报
回复
学习
didoo 2005-04-22
  • 打赏
  • 举报
回复
看样子是不行
langzi8818 2005-04-22
  • 打赏
  • 举报
回复
来学习
liujingfu123 2005-04-22
  • 打赏
  • 举报
回复
搞不定,
加载更多回复(12)

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧