[疑难] 有办法遍历命名枚举吗?

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);

}

}



}

Global site tag (gtag.js) - Google Analytics