I find myself using __traits(hasMember, T, "member") a lot.
It's really basic feature of meta-programming.

I'm not a fan of the "__usedByCompiler" syntax, but that's a
whole different discussion. __traits() is fine (besides the fact
that first-argument-as-function is syntactically inconsistent to
the rest of the language), but std.traits doesn't wrap it
correctly; and, because it's globally available anyways & so
often used, shouldn't have to be imported to use in the first
place, IMO.

What I would like to see happen: Have a traits.d which replaces
std.traits and is always included (like object.d) which properly
wraps __trait functions.

so in traits.d:

     // use alias T, so we can pass "laser.x" to it
     // without having to pass typeof(laser.x). Just like
     // we can with using __traits(hasMember, ...)

     template hasMember(alias T, string member) {
         enum hasMember = __traits(hasMember, T, member);
     }

we can then write:

     auto laser = ship.fire();
     static if(traits.hasMember!(laser.x, "isProp") ...;

which feels syntactically consistent. Because traits are in their
own module, we could emit the "traits." and just call
"hasMember()". Even better, if UFCS allows, we could simply write:

     static if(laser.x.hasMember!("isProp")) ...;


my 2 cents.

Reply via email to