On Thursday, 11 August 2016 at 19:28:47 UTC, Lodovico Giaretta wrote:
On Thursday, 11 August 2016 at 18:11:30 UTC, Engine Machine wrote:
[...]

If, in your case, it is possible to use one type as the other, then specify it. I mean, implement a templated opAssign that allows you to assign values of one instantiation to values of another. While doing so, remember that this will not change the behaviour of the assigned-to variable, but will only transfer the runtime state from one variable to the other.

struct S(T1, T2)
{
    T1 t;
    void opAssign(T)(auto ref S!(T1, T) other)
    {
        t = other.t;
    }
}
unittest
{
    S!(int, float) x(1);
    S!(int, char) y(3);

    x = y;
assert(x.t == 3); // the value of x is changed static assert(is(typeof(x) == S!(int, float))) // the type of x isn't changed
}

Ok, well, my point is that in some cases, the OpAssign is trivially since everything is copied. I guess being explicit is not a bad thing in this case though.


Reply via email to