Operators overloading

Idan Arye GenericNPC at gmail.com
Sun May 19 03:41:52 PDT 2013


On Sunday, 19 May 2013 at 07:32:11 UTC, matovitch wrote:
> 	const Vertex opBinary(string op : ["+", "-"])(const ref Vertex 
> vertex)	
> 	{
> 		{
> 			Vertex result = *this;
> 			mixin("result" ~ op ~ "= vertex;");
> 			return result;
> 		}
> 	}
>
> 	const T opBinary(string op : "*")(const ref Vertex vertex)
> 	{
> 		
> 		T result = 0;
> 		foreach(i; 0..vertex_size)
> 			result += coordinate[i] * vertex.coordinate[i];
> 		return result;
> 	}
>
> The second one is okay, but the fisrt one isn't correct. I 
> think this kind of template specialization over a list could be 
> great with mixins and static if/switch. What do you think ? May 
> be there is an other way to do what I want...

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[]`?)

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;
	}

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;
     }


More information about the Digitalmars-d mailing list