On 6/12/17 3:36 PM, H. S. Teoh via Digitalmars-d-learn wrote:
On Mon, Jun 12, 2017 at 07:38:44PM +0000, Gary Willoughby via 
Digitalmars-d-learn wrote:
In the following code is there any way to make the `opBinary` method
generic to be able to accept immutable as well as a standard type? The
code currently passes the unit test but I wonder if I could get rid of
the duplication to overload the operator? I'm failing badly.

This is what inout was designed for:

        public inout Rational opBinary(string op)(inout Rational rhs)
        {
                static if (op == "+")
                {
                        return inout(Rational)(0, 0);
                }
                else
                {
                        static assert(0, "Operator '" ~ op ~ "' not 
implemented");
                }
        }

That should do the trick.

Nope, const works just fine. A clue is in your return type -- it's not inout!

This should work:

public Rational opBinary(string op)(Rational rhs) const

If Rational had any indirections, then inout would be required, and your signature wouldn't work (because you can't convert an inout(SomethingWithPointers) to SomethingWithPointers).

Why do I need to make the member function const, but not the parameter? Because the parameter is taken by value, 'this' is a reference.

-Steve

Reply via email to