Mixin Templates and Operators
    Steven Schveighoffer 
    schveiguy at gmail.com
       
    Wed Apr  6 17:13:20 UTC 2022
    
    
  
On 4/6/22 6:36 AM, francesco.andreetto wrote:
> I have two structs, point and vec, in which I want to implement some 
> arithmetic operations.
> The operations are:
> 
> ```
> point - point = vec
> point + vec = point
> ```
> 
> Using mixin templates the code compiles but calling the operations in 
> the main causes an "incompatible type" Error:
This seems like a bug in the compiler. You can mixin operator overloads 
using one mixin template, but not multiple.
e.g. raylib-d uses this:
https://github.com/schveiguy/raylib-d/blob/89733bab9fd1d3588c14f4aa54b62ad45022a105/source/raymathext.d#L75
> 
> I tried to implement a single template:
> 
> ```d
> mixin template sumDiff(T, R){
>     R opBinary(string op)(T rhs) const
>     if (op == "+" || op == "-"){
>        return mixin("R(x " ~ op ~ " rhs.x, y " ~ op ~ "rhs.y, z " ~ op ~ 
> " rhs.z)");
>     }
> }
> ```
> 
> but the same error occurs.
This is different from your original. If I do this, it works:
```d
mixin template both(T, R) {
    R opBinary(string op : "+")(T rhs) const
    {
       return R(x + rhs.x, y + rhs.y, z + rhs.z);
    }
    T opBinary(string op : "-")(R rhs) const
    {
       return T(x - rhs.x, y - rhs.y, z - rhs.z);
    }
}
struct point{
    float x, y, z;
    mixin both!(vec, point);
}
```
> 
> If I don't use the mixin templates and, instead, I overload the 
> operations into the structures everything works.
It also works to call `opBinary` directly:
```d
vec v1 = p1.opBinary!"-"(p2);
```
Which leads me to believe it's not an ambiguity error, but rather just a 
straight omission on how the operator overloading works.
I think you should file a bug.
-Steve
    
    
More information about the Digitalmars-d-learn
mailing list