On 2014-08-29 16:48:51 +0000, Andrei Alexandrescu said:

Worth a look:

http://stackoverflow.com/questions/25555329/d-finding-all-functions-with-certain-attribute

Andrei

That's some pretty neat code, I did something similar awhile ago for deserializing classes. Here's a reduced case of it:

http://dpaste.dzfl.pl/4fffa339368f

The facility to be able to create such a factory through compile time reflection is absolutely awesome. However, it "feels" as though the ability to do this is making use of undefined behavior rather than actual language features.

First:

I consider it sort of a language wart that alias hack(alias T) = T; is necessary for aliasing to the particular symbol, and that the __traits(getMember) expression can't be substituted in to the same places as the alias to it without compiler errors. It's very non-intuitive. I would have never figured that out on my own with out some other D wizards helping me about a year ago. I still don't understand why I can't simply do :
                alias member = __traits(getMember, ...);

Also:

The way that the foreach works in the pasted example is very surprising. I would be nice if this was a "static foreach" instead of just a foreach which happens to run at compile time over a TypeTuple. Normally doing a switch inside a foreach like that would not work at all, but near as I can tell the compiler unrolls the whole thing since it's inputs are known at compile time.

Finally:

If you actually want to have something that returns a TypeTuple!() of only subclasses which you can foreach over in other places -- you have to make a *very* ugly recursive template:

(Line 208 thru Line 235 returns a TypeTuple of all subclasses of the Message class)
        
        
https://github.com/schancel/gameserver/blob/master/source/messages/core.d#L208

Making these awesome feature more intuitive and easy to use would go a long way. I feel like this should be on your short list along with the GC and C++ compatibility.

-S.

Reply via email to