On Saturday, 21 September 2013 at 11:35:11 UTC, bearophile wrote:

init is part of a type and you can't change it.

Bye,
bearophile

Well, D wouldn't be D, if it did not allow something like this for aggregate types:

import core.stdc.string, std.stdio;

pure hack(T)(T value) if (is(T == class))
{
    byte[] init_mem = new byte[T.classinfo.init.length];
memcpy(init_mem.ptr, cast(byte*)value, T.classinfo.init.length);
    T.classinfo.init = init_mem;
}

class A
{
   int a;
}

pure foo(int val)
{
   A a = new A;
   a.a++;
   hack(a);
   return a.a + val;
}

void main()
{
   writeln(0.foo, 0.foo, 0.foo); // prints 1,2,3
}

And taking into accout some additional runtime magic, assertion below may fail:

class A { int i = 5; }
struct S { A a;}
S s;
assert(s.a is null);

Reply via email to