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);