On 05/19/2013 12:41 PM, Idan Arye wrote:
...

I think a better syntax would be:

     const Vertex opBinary(string op : "+", "-")(const ref Vertex vertex)

this will save a bit of ambiguity(`op` is a `string` specialization of
`string[]`?)


It moves the ambiguity from analysis into the parser.

At any rate, I'm not sure how useful it would be. Operator overloading
code usually fit for a single operator - you usually write one for each
operator:

     const Vertex opBinary(string op : "+")(const ref Vertex vertex)
     {
         Vertex result = this;
         result += vertex;
         return result;
     }
     const Vertex opBinary(string op : "-")(const ref Vertex vertex)
     {
         Vertex result = this;
         result -= vertex;
         return result;
     }


Your example shows how operator overloading code often fits for multiple operators.

If you want to have several operators in the same method, you can afford
the verbosity of:

     const Vertex opBinary(string op)(const ref Vertex vertex)
         if (__traits(compiles, mixin("this " ~ op ~ "= vertex;")))
     {
         Vertex result = /*[...]*/this;
         mixin("result" ~ op ~ "= vertex;");
         return result;
     }

This kind of template constraint may allow leaking of implementation details.

Eg. v.opBinary!".foo+"

Reply via email to