View mode: basic / threaded / horizontal-split · Log in · Help
May 07, 2012
UFCS and operator overloading
Hi,

from my understanding UFCS is supposed to work with operator overloading. I.e.
in the following a + b should work

struct Foo {}

Foo opBinary(string op)(Foo lhs, Foo rhs) if (op == "+")
{
   return Foo.init;
}

unittest
{
   Foo a, b;
   a + b; // fails to compile
}

Is UFCS supposed to work with operator overloading, isn't it?

Jens
May 07, 2012
Re: UFCS and operator overloading
"Jens Mueller" <jens.k.mueller@gmx.de> wrote in message 
news:mailman.391.1336410464.24740.digitalmars-d@puremagic.com...
> Hi,
>
> from my understanding UFCS is supposed to work with operator overloading. 
> I.e.
> in the following a + b should work
>
> struct Foo {}
>
> Foo opBinary(string op)(Foo lhs, Foo rhs) if (op == "+")
> {
>    return Foo.init;
> }
>
> unittest
> {
>    Foo a, b;
>    a + b; // fails to compile
> }
>
> Is UFCS supposed to work with operator overloading, isn't it?
>
> Jens

I don't know why that doesn't work (unless you just need to make it "auto c 
= a + b;" so it isn't a "statement has no effect"?), but FWIW that's not an 
example of UFCS. UFCS would mean calling your opBinary above like this:

a.opBinary!"+"(b)

Instead of this:

opBinary!"+"(a, b)
May 07, 2012
Re: UFCS and operator overloading
Still, not having non-member operator overloads is very bothersome.

On Tue, May 8, 2012 at 12:37 AM, Nick Sabalausky
<SeeWebsiteToContactMe@semitwist.com> wrote:
> "Jens Mueller" <jens.k.mueller@gmx.de> wrote in message
> news:mailman.391.1336410464.24740.digitalmars-d@puremagic.com...
>> Hi,
>>
>> from my understanding UFCS is supposed to work with operator overloading.
>> I.e.
>> in the following a + b should work
>>
>> struct Foo {}
>>
>> Foo opBinary(string op)(Foo lhs, Foo rhs) if (op == "+")
>> {
>>    return Foo.init;
>> }
>>
>> unittest
>> {
>>    Foo a, b;
>>    a + b; // fails to compile
>> }
>>
>> Is UFCS supposed to work with operator overloading, isn't it?
>>
>> Jens
>
> I don't know why that doesn't work (unless you just need to make it "auto c
> = a + b;" so it isn't a "statement has no effect"?), but FWIW that's not an
> example of UFCS. UFCS would mean calling your opBinary above like this:
>
> a.opBinary!"+"(b)
>
> Instead of this:
>
> opBinary!"+"(a, b)
>
>
>



-- 
Bye,
Gor Gyolchanyan.
May 08, 2012
Re: UFCS and operator overloading
On 05/07/2012 10:37 PM, Nick Sabalausky wrote:
> "Jens Mueller"<jens.k.mueller@gmx.de>  wrote in message
> news:mailman.391.1336410464.24740.digitalmars-d@puremagic.com...
>> Hi,
>>
>> from my understanding UFCS is supposed to work with operator overloading.
>> I.e.
>> in the following a + b should work
>>
>> struct Foo {}
>>
>> Foo opBinary(string op)(Foo lhs, Foo rhs) if (op == "+")
>> {
>>     return Foo.init;
>> }
>>
>> unittest
>> {
>>     Foo a, b;
>>     a + b; // fails to compile
>> }
>>
>> Is UFCS supposed to work with operator overloading, isn't it?
>>
>> Jens
>
> I don't know why that doesn't work (unless you just need to make it "auto c
> = a + b;" so it isn't a "statement has no effect"?), but FWIW that's not an
> example of UFCS. UFCS would mean calling your opBinary above like this:
>
> a.opBinary!"+"(b)
>
> Instead of this:
>
> opBinary!"+"(a, b)
>
>

 a + b => a.opBinary!"+"(b) => opBinary!"+"(a, b)
       ^                    ^
standard rewrite           UFCS
May 08, 2012
Re: UFCS and operator overloading
Timon Gehr wrote:
> On 05/07/2012 10:37 PM, Nick Sabalausky wrote:
> >"Jens Mueller"<jens.k.mueller@gmx.de>  wrote in message
> >news:mailman.391.1336410464.24740.digitalmars-d@puremagic.com...
> >>Hi,
> >>
> >>from my understanding UFCS is supposed to work with operator overloading.
> >>I.e.
> >>in the following a + b should work
> >>
> >>struct Foo {}
> >>
> >>Foo opBinary(string op)(Foo lhs, Foo rhs) if (op == "+")
> >>{
> >>    return Foo.init;
> >>}
> >>
> >>unittest
> >>{
> >>    Foo a, b;
> >>    a + b; // fails to compile
> >>}
> >>
> >>Is UFCS supposed to work with operator overloading, isn't it?
> >>
> >>Jens
> >
> >I don't know why that doesn't work (unless you just need to make it "auto c
> >= a + b;" so it isn't a "statement has no effect"?), but FWIW that's not an
> >example of UFCS. UFCS would mean calling your opBinary above like this:
> >
> >a.opBinary!"+"(b)
> >
> >Instead of this:
> >
> >opBinary!"+"(a, b)
> >
> >
> 
>  a + b => a.opBinary!"+"(b) => opBinary!"+"(a, b)
>        ^                    ^
> standard rewrite           UFCS

Yes. That's how it should be. I reported it.

Jens
May 08, 2012
Re: UFCS and operator overloading
"Timon Gehr" <timon.gehr@gmx.ch> wrote in message 
news:jobo5r$1cf7$1@digitalmars.com...
> On 05/07/2012 10:37 PM, Nick Sabalausky wrote:
>>
>> I don't know why that doesn't work (unless you just need to make it "auto 
>> c
>> = a + b;" so it isn't a "statement has no effect"?), but FWIW that's not 
>> an
>> example of UFCS. UFCS would mean calling your opBinary above like this:
>>
>> a.opBinary!"+"(b)
>>
>> Instead of this:
>>
>> opBinary!"+"(a, b)
>>
>>
>
>  a + b => a.opBinary!"+"(b) => opBinary!"+"(a, b)
>        ^                    ^
> standard rewrite           UFCS
>

/facepalm

Yea, I get it now ;)
Top | Discussion index | About this forum | D home