foo => "bar" key/value literals in D!

John via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Wed Jun 8 02:19:46 PDT 2016


On Friday, 27 May 2016 at 18:10:59 UTC, Vladimir Panteleev wrote:
> This is by far the most appealing way to implement named 
> arguments that I've seen so far:
>
> https://github.com/CyberShadow/ae/blob/master/utils/meta/args.d

Another cool thing this enables: object initializers.

   T init(T, Args...)() {
     import std.traits : FunctionTypeOf;

     static struct DummyType {}
     static if (is(T == class)) T r = new T;
     else T r;

     foreach (arg; Args) {
       alias fun = arg!DummyType;
       static if (is(FunctionTypeOf!fun PT == __parameters)) {
         enum name = __traits(identifier, PT);
         foreach (m; __traits(allMembers, T)) {
           static if (name == m) __traits(getMember, r, m) = 
fun(DummyType.init);
         }
       }
     }
     return r;
   }

   struct Point {
     int x, y;
   }

   void main() {
     auto pt = init!(Point, x => 123, y => 456);
     assert(pt.x == 123 && pt.y == 456);
   }


More information about the Digitalmars-d-announce mailing list