On Tuesday, 30 April 2019 at 13:10:54 UTC, Adam D. Ruppe wrote:
On Tuesday, 30 April 2019 at 08:20:29 UTC, JN wrote:
It might be nifty by D standards, but for a person not familiar with D

Or, as someone familiar with D, I wonder why not just use a plain struct. D allows you to set initial values for struct members plainly.

Yeah, though I can see some use cases for a struct with all nullable fields and a way to combine with a regular version of that struct. This could be made a lot easier than in the article:

import std.traits : FieldNameTuple;
import std.typecons : Nullable;

struct Partial(T) if (is(T == struct)) {
    static foreach (e; FieldNameTuple!T)
mixin("Nullable!(typeof(__traits(getMember, T, e))) "~e~";");
}

auto combine(T, PT)(T t, PT pt) if (is(PT == Partial!T)) {
    T result;
    static foreach (e; FieldNameTuple!T)
__traits(getMember, result, e) = __traits(getMember, pt, e).get(__traits(getMember, t, e));
    return result;
}

struct S {
    int x,y;
}

unittest {
    S a = S(1,2);
    Partial!S b;
    b.x = 3;
    assert(a.combine(b) == S(3,2));
}

Now, for the abomination that is callMemberFunctionWithParamsStruct!(t, "f")(combined)... It's just t.f(combined.tupleof) in a bad disguise, and I really can't see the benefit.

Lastly, the use of a mixin to define the struct ensures you can't put methods on the struct, thus drastically reducing usability.

All in all, it's a fun beginner's project, but the quality may not be good enough that it should be on the blog.

--
  Simen

Reply via email to