struct: default construction or lazy initialization.

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 31 15:52:31 PST 2017


On 01/31/2017 03:15 PM, bitwise wrote:

 > If the object is defined at module scope as shared static immutable

Yes, the situation is different from C++ but it's always possible to 
call a function (which constructor is one) to make the object.

It is indeed possible to initialize immutable objects by pure functions 
as done inside shared static this() below:

import core.stdc.stdlib;

struct Foo(T)
{
     T* payload;

     ~this() { free(payload); }

     void foo() {
         // do something with payload that fails if not initialized
     }
}

auto makeFoo(T)() {
     // This could be a static member function, even opCall().

     auto p = cast(T*)malloc(T.sizeof);
     *p = 42;
     return immutable(Foo!T)(cast(immutable(T)*)p);
}

shared static immutable(Foo!int) foo;

shared static this() {
     foo = makeFoo!int();
}

void main() {
     assert(*(foo.payload) == 42);
}

Ali



More information about the Digitalmars-d-learn mailing list