On Wednesday, 6 July 2016 at 10:25:44 UTC, zodd wrote:
Thank you for a great example! D's power still surprises me a lot.

just be careful to not carry wrapper around for too long, so it won't outlive it's parent.

p.s. or this (abomination, i know!). ripped out of one of my monkeycoding projects:


import std.stdio;

template GST(string fldname, size_t l=__LINE__) {
  private import std.conv : to;
  private enum bgsn = "z_buildGST_"~l.to!string;
  private enum gn = "get_"~fldname;
  private enum sn = "set_"~fldname;
  private enum ft = "typeof(cast()"~gn~")";
  enum GST =
    "private alias "~bgsn~"_T = "~ft~";"~
"public @property auto "~fldname~"() (in auto ref "~bgsn~"_T v) { "~sn~"(v); return "~bgsn~"; }\n"~ "public @property auto "~fldname~"() () const { return "~gn~"; }\n"~ "public @property auto "~fldname~"() () { return "~bgsn~"; }\n"~
    "private auto "~bgsn~"(T=typeof(this)) () {\n"~
    "  static struct "~bgsn~"_st {\n"~
    "    T* _p;\n"~
    "    alias _g this;\n"~
    "    auto _g () inout { return _p."~gn~"; }\n"~
" ref auto opAssign() (in auto ref "~bgsn~"_T v) { _p."~sn~"(v); return this; }\n"~ " ref auto opOpAssign(string op) (in auto ref "~bgsn~"_T v) { _p."~sn~"(mixin(`_p."~gn~"`~op~`v`)); return this; }\n"~ " string toString () const { import std.conv : to; return _p."~gn~".to!string; }\n"~
    "  }\n"~
    "  return "~bgsn~"_st(&this);\n"~
    "}\n"~
    "";
}

struct Foo {
  int mVal;

  this (int n) { mVal = n; }

  int get_val () const {
    //import core.stdc.stdio : printf; printf("getter\n");
    return mVal+1000;
  }

  void set_val (int v) {
    //import core.stdc.stdio : printf; printf("setter\n");
    mVal = v%1000;
  }

  mixin(GST!"val");
}


void main () {
  writeln(Foo(42).val = 45);

  Foo foo;
  foo.val = 1020;
  writeln("mv: ", foo.mVal, " : ", foo.val);

  foo.val += 15;
  writeln("mv: ", foo.mVal, " : ", foo.val);

  foo.val--;
  writeln("mv: ", foo.mVal, " : ", foo.val);

  int n = (foo.val += 6);
  writeln("n: ", n);
  writeln("mv: ", foo.mVal, " : ", foo.val);
}

Reply via email to