Thread overview
Using opOpAssign, cannot assign sequence
Apr 05, 2019
Alex
Apr 05, 2019
Alex
Apr 05, 2019
ag0aep6g
Apr 05, 2019
Paul Backus
April 05, 2019
class X(T)
	void opOpAssign(string op)(T d)

If T has more than length of one then

x += ????

We can work around this but it seems to me that we should be able to get it to work in some way

x += Alias!(a,b,c)

fails to package it up as do all other things I have tried.

void Add(Ts d) { opOpAssign!("+")(d); }

Then x.Add(a,b,c) works fine.

But of course defeats the entire purpose of opOpAssigns short hand notation.




		
April 05, 2019
On Friday, 5 April 2019 at 13:59:27 UTC, Alex wrote:
> class X(T)
> 	void opOpAssign(string op)(T d)
>
> If T has more than length of one then
>
> x += ????
>
> We can work around this but it seems to me that we should be able to get it to work in some way
>
> x += Alias!(a,b,c)
>
> fails to package it up as do all other things I have tried.
>
> void Add(Ts d) { opOpAssign!("+")(d); }
>
> Then x.Add(a,b,c) works fine.
>
> But of course defeats the entire purpose of opOpAssigns short hand notation.
>
>
>
>
>
I was thinking using tuple would work(of course is longer than Add but would allow for a more general approach, it would require automatic unpacking though and so doesn't work.
April 05, 2019
On 05.04.19 16:00, Alex wrote:
> I was thinking using tuple would work(of course is longer than Add but would allow for a more general approach, it would require automatic unpacking though and so doesn't work.

`tuple` works for me:

----
import std.typecons: tuple;

class X(T ...)
{
    void opOpAssign(string op)(T d) {}
}

void main()
{
    auto x = new X!(int, float, string);
    int a = 42;
    float b = 4.2;
    string c = "foo";
    x += tuple(a, b, c);
}
----
April 05, 2019
On Friday, 5 April 2019 at 13:59:27 UTC, Alex wrote:
> class X(T)
> 	void opOpAssign(string op)(T d)
>
> If T has more than length of one then
>
> x += ????
>
> We can work around this but it seems to me that we should be able to get it to work in some way
>
> x += Alias!(a,b,c)
>
> fails to package it up as do all other things I have tried.

Works for me if you make opOpAssign a variadic template:

    void opOpAssign(string op, Args...)(Args args)

Full example: https://run.dlang.io/is/dPk3BN