[疑难] 有办法遍历命名枚举吗?
hurd
2009-03-12
有办法遍历命名枚举吗?
|
|
Colorful
2009-03-12
什么叫命名枚举?
你指的是不是类似 enum XXXX { //... } 格式的枚举形式? 如果是这样的话,应该没办法,至少俺不知道,呵呵。 不过俺很好奇为什么要遍历枚举呢?实在是想不出这样做的意义。 |
|
qiezi
2009-03-12
__traits(allMembers, MyEnum)
|
|
hurd
2009-03-12
遍历枚举是为了把整数值转化为枚举变量名, 在debug的时候有用。
现在phobos提供了模板定义枚举的方法可以作到这个,但是很多时候枚举是外部项目定义的。。。 |
|
hurd
2009-03-12
__traits很不错, 但是D1似乎没这个。。。
|
|
betty_betty2008
2009-03-12
哈,俺也有一个类似的问题,搭车请教一下。
C中的#操作符+宏定义可实现将任意类型变量的值转换为字符形式,请问D中有没有类似的实现?俺知道Mixin有近似功能,但如何能做到#的简洁,如果能贴一小段实例,将非常感谢。 |
|
betty_betty2008
2009-03-13
BTW, d 新闻组也有人在问:
http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=15841 那位老兄的办法是将d 源码里的struct.tupleof 相同功能实现代码(枚举结构成员)COPY给Enum,实现enum.tupleof. enum_foreach.c俺下载了,放在最后。 import std.stdio; enum ABC { A, B, C }; void main(string[] args) { foreach(a; ABC.tupleof) { writefln(a); } } prints: A B C 附:enum_foreach.c /* If e.tupleof */ if (ident == Id::tupleof) { /* Create a TupleExp out of the fields of the struct e: * (e.field0, e.field1, e.field2, ...) */ e = e->semantic(sc); // do this before turning on noaccesscheck Expressions *exps = new Expressions; exps->reserve(sym->members->dim); for (size_t i = 0; i < sym->members->dim; i++) { EnumMember *em = ((Dsymbol *)sym->members->data[i])->isEnumMember(); char* s = em->ident->toChars(); Expression *fe = new StringExp(e->loc, s, strlen(s), 'c'); exps->push(fe); } e = new TupleExp(e->loc, exps); Scope sss; e = e->semantic(&sss); return e; } |
|
laodizhuq
2009-03-13
enum不是有一个values()方法的吗??
这个方法就是返回所有枚举值的列表的。 |
|
betty_betty2008
2009-03-13
laodizhuq 写道 enum不是有一个values()方法的吗??
这个方法就是返回所有枚举值的列表的。 这是D1还是D2? |
|
zozoh
2009-03-17
package com.zzh.castor.castor;
import java.lang.reflect.Field; import com.zzh.castor.Castor; import com.zzh.castor.FailToCastObjectException; import com.zzh.lang.Lang; @SuppressWarnings("unchecked") public class Number2Enum extends Castor<Number, Enum> { @Override protected Enum cast(Number src, Class<?> toType, String... args) throws FailToCastObjectException { try { for (Field field : toType.getFields()) { if (field.getType() == toType) { Enum em = (Enum) field.get(null); if (em.ordinal() == src.intValue()) return em; } } throw Lang.makeThrow(FailToCastObjectException.class, "Can NO find enum value in [%s] by int value '%d'", toType.getName(), src .intValue()); } catch (Exception e) { throw Lang.wrapThrow(e, FailToCastObjectException.class); } } } |