On Tue, 24 Aug 2010 17:19:25 -0500, Andrej Mitrovic <andrej.mitrov...@whatever.com> wrote:

[snip]

struct CheckedInt(N) if (isIntegral!N)
{
    private N value;
   this(N value)
    {
        this.value = value;
    }
   @property
    auto Value()
    {
        return value;
    }
   // addition
    CheckedInt opBinary(string op)(CheckedInt rhs) if (op == "+")
    {
        auto result = value + rhs.value;
       enforce(rhs.value >= 0 ? result >= value : result < value);
        return result;
    }
}

I don't understand why he's trying to return result here (unless it was a mistake). Result is going to have the type of "private N value", whatever N may be, and this is conflicting with the return type which is CheckedInt. So, this won't compile.

That's a bug. The return value should be CheckedInt(result);


He has the same returns for subtraction and multiplication, but for others like division, shift and bitwise overload he has this:

// division and remainder
    CheckedInt opBinary(string op)(CheckedInt rhs)
    if (op == "/" || op == "%")
    {
        enforce(rhs.value != 0);
        return CheckedInt(mixin("value" ~ op ~ "rhs.value"));
    }

This looks correct. If I change the add overload from the code to this:

// addition
    CheckedInt opBinary(string op)(CheckedInt rhs) if (op == "+")
    {
        auto result = value + rhs.value;
       enforce(rhs.value >= 0 ? result >= value : result < value);
        return CheckedInt(mixin("value" ~ op ~ "rhs.value"));
    }

Then the return statement calls a CheckedInt constructor and I get back a CheckedInt struct with the right value in the private variable "value".

What I don't understand is how the constructor can be called like that. In my example the mixin would convert the code to:

return CheckedInt(10);

But if I ever tried a call like "CheckedInt(10)" in a unittest block, it wouldn't work. So how does this magic work?


http://www.digitalmars.com/d/2.0/mixin.html

--
Yao G.

Reply via email to