Explicit call of ternary compare
monarch_dodra
monarchdodra at gmail.com
Mon Jul 23 08:54:01 PDT 2012
On Monday, 23 July 2012 at 15:37:17 UTC, Simen Kjaeraas wrote:
> On Mon, 23 Jul 2012 16:32:15 +0200, monarch_dodra
> <monarchdodra at gmail.com> wrote:
>
>> Is there any (efficient and correct) way to do ternary
>> comparison on two objects?
>>
>> You know the:
>> ----
>> if(a<b) return -1;
>> if(b<a) return 1;
>> return 0;
>> ----
>>
>> I'm using the above method in a template, and the problem is
>> that if a or b is a struct/class, this will resolve to 4 (!)
>> calls to opCmp.
>>
>
> First, no. It will only call opCmp twice - once for each
> comparison. You're thinking of opEquals.
Hum. Fine. I though that if a and b were class, then there was
the same behavior. My bad.
But that's still twice too many calls.
> Second, have you tried a.opCmp(b), cause that's the logical
> thing to try, and it works.
It works but *if* the types are not equal, then this may or may
not be equivalent to b.opCmp(a).
> Like other operator magic in D, it's not really magic. It's
> just a simple lowering of a < b to a.opCmp(b) < 0.
> In other words, operator overload functions in D can be called
> just like regular functions:
This lowering only applies:
*If a.opCmp(b) and b.opCmp(a) resolve to the same function.
*Otherwise, exactly one of a.opCmp(b) and b.opCmp(a) must be
compilable.
I'd agree with a rewrite, but there are tricky edge cases. I
would have thought the language provided a ternary compare. If it
doesn't, I'd say it should. Preferably in std.functional?
More information about the Digitalmars-d-learn
mailing list