Generic Property Implementation

Simen Kjærås simen.kjaras at gmail.com
Mon Mar 12 07:04:19 UTC 2018


On Saturday, 10 March 2018 at 17:43:06 UTC, Simen Kjærås wrote:
> I'm not sure how fixable this is, but I am sure that there's 
> plenty of benefit to being able to write code like this:
>
> struct S {
>     int n, m;
>     SomeType!(() => n + m) a;
> }
>
> over this:
>
> struct S {
>     int n, m;
>     auto a() { return SomeType!(() => n + m)(); }
> }
>
> Anyways, I filed a bug for it:
> https://issues.dlang.org/show_bug.cgi?id=18587

Actually, this is not fixable. If we consider for a moment the 
internals of SomeType in the above code, it's something like this:

struct SomeType(alias fn) {
     S* context;
}

The full layout of S then becomes this:

struct S {
     int n;
     int m;
     S* a.context; // points to 'this'.
}

Since structs in D are defined to be movable by blitting only, 
with no cleanup afterwards, internal pointers are a no-no. Ref 
https://dlang.org/spec/garbage.html:

> Do not have pointers in a struct instance that point back to 
> the same instance. The trouble with this is if the instance 
> gets moved in memory, the pointer will point back to where it 
> came from, with likely disastrous results.

One possible solution would be for the above code to generate the 
function a() instead of making 'a' a member. This has its own set 
of issues, though - suddenly something that looks like a member 
isn't one, and its address can't be taken, it can't be passed by 
ref, etc.

--
   Simen


More information about the Digitalmars-d-learn mailing list