On Sunday, 19 May 2013 at 10:03:27 UTC, Timon Gehr wrote:
On 05/19/2013 09:32 AM, matovitch wrote:
Okay, putting the if inside is quite easy :


It is not a valid transformation. This removes the condition from the signature.

    const Vertex opBinary(string op)(const ref Vertex vertex)
    {
        static /*[...]*/ if (op == "+" || op == "-")
        {
            Vertex result = *this;
            mixin("result" ~ op ~ "= vertex;");
            return result;
        }
    }

But...I'd like to define cross product :

    const T opBinary(string op)(const ref Vertex vertex)
    {
        static if (op == "*")
        {
            T result = 0;
            foreach(i; 0..vertex_size)
                result += coordinate[i] * vertex.coordinate[i];
            return result;
        }
    }

The compiler is not so great here and doesn't distinguish the two
opBinary by their signatures. Why ?

Because the two signatures are identical.

const T opBinary(string op)(const ref Vertex vertex);

Do this:

    const Vertex opBinary(string op)(const ref Vertex vertex)
    if (op == "+" || op == "-"){
        Vertex result = *this;
        mixin("result" ~ op ~ "= vertex;");
        return result;
    }

    const T opBinary(string op)(const ref Vertex vertex)
    if (op == "*"){
        T result = 0;
        foreach(i; 0..vertex_size)
            result += coordinate[i] * vertex.coordinate[i];
        return result;
    }

Oh yes ! You are right...it takes a vertex in both cases. Thanks for losing your time with me. :-)

Reply via email to