Using mixin templates for operator overloading.
    Balagopal Komarath via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Sat Aug 19 03:16:18 PDT 2017
    
    
  
Let us say I want to automatically define subtraction given that 
addition and negation are defined. I tried the following using 
mixin templates. If I simply mixin the template using "mixin 
sub;", then it gives the error
tmpmixin.d(29): Error: incompatible types for ((a) - (b)): 'A!0' 
and 'A!0'
I found out that mixin using an identifier for template mixins 
and then using an alias declaration as in the code given below 
can be used to bring in overloads. But, this produces the error.
tmpmixin.d(23): Error: alias tmpmixin.A!0.A.opBinary conflicts 
with template tmpmixin.A!0.A.opBinary(string op : "+")(in A 
other) at tmpmixin.d(14)
tmpmixin.d(29): Error: template instance tmpmixin.A!0 error 
instantiating
As you can see, there is no conflict logically. One defines 
addition and the mixin defines subtraction.
What is the right way to do this?
mixin template sub()
{
     alias T = typeof(this);
     T opBinary(string op : "-")(in T other) const
     {
         return this + (-other);
     }
}
struct A(int x)
{
     int a;
     A opBinary(string op : "+")(in A other) const
     {
         return A(this.a + other.a);
     }
     A opUnary(string op : "-")() const
     {
         return A(-a);
     }
     mixin sub ops;
     alias opBinary = ops.opBinary;
}
void main()
{
     import std.stdio : writeln;
     auto a = A!0(5), b = A!0(6);
     writeln(a-b);
}
    
    
More information about the Digitalmars-d-learn
mailing list