reflective enums

Kevin Bealer kevinbealer at gmail.com
Fri Feb 16 23:44:03 PST 2007


renoX wrote:
> Kevin Bealer a écrit :
>> == Quote from renoX (renosky at free.fr)'s article
>>> - why the name getString instead of the usual toString name?
>>
>> That could be changed too; I think of toString() as an object method, and
>> when adding a static method, I figured I should use a different name to
>> avoid conflicting with the method.  I didn't really check whether there
>> is a real conflict on this.
> 
>  From my testing, it doesn't trigger a conflict, but I've only tested it 
> inside one file.
> 
>> There is kind of a strangeness with the way I defined this in that you
>> creating instances of the Enum!(...) struct is not useful.  The type is
>> only really interesting for its static properties.
> 
> About this I was wondering if it wouldn't be less strange to do a 
> template like this:
> 
> // expected usage: DefEnum!("enum ListEnumFoo {A,B=1};")
> template DefEnum(char[] def_enum) {
> 
>     mixin(def_enum);
> 
>     static toString(EnumType!(def_enum) x)
>     {
>         // function body similar to the inital get_String()
>     }
> }
> 
> Advantages:
> -The reflective enum type is really an enum type, so it acts like one.
> -No weird struct.
> -When(If) I can convince Walther that writef("foo %s",x) means really 
> writef("foo "~x.toString()); we could write:
> writef("enum x value is %d and name is %s\n",x,x); and have the correct 
> result, because toString(ListEnumFoo x) would hide toString(int x) {x 
> being an enum variable from type ListEnumFoo).
> 
> Disadvantage:
> No easy way to iterate among the enum values: we cannot do
> foreach(v; ListEnumFoo) because now ListEnumFoo is an enum not a struct..
> And we cannot pass an enum type as a parameter, other it would be easy 
> to define function 'keys' and 'values' (like for associative arrays), so 
> we'd need a dummy parameter, i.e you wouldn't be able to write
> foreach (v; ListEnumFoo) {} and
> neither foreach (v; ListEnumFoo.values()) {}
> but foreach (v; ListEnumFoo.A.values()) {} could perhaps work.
> 
> What do you think about this other way to do it?
> 
> Regards,
> renoX

I don't like the extra syntax -- in your example, the word 'enum' 
appears three times.  I also like the ability to foreach() over an enum. 
But this has made me think of another idea that adds some of the 
"enum"-ness back to the struct.  I'll post it if I can make it work.

Kevin



More information about the Digitalmars-d mailing list