C++ overloaded operators and D

IgorStepanov via Digitalmars-d digitalmars-d at puremagic.com
Wed Nov 12 13:17:41 PST 2014


On Wednesday, 12 November 2014 at 20:49:42 UTC, Marc Schütz wrote:
> On Wednesday, 12 November 2014 at 19:32:32 UTC, IgorStepanov 
> wrote:
>> On Wednesday, 12 November 2014 at 14:41:17 UTC, Marc Schütz 
>> wrote:
>>> On Wednesday, 12 November 2014 at 11:43:36 UTC, IgorStepanov 
>>> wrote:
>>>> C++ and D provides different behaviour for operator 
>>>> overloading.
>>>> D has a opIndex + opIndexAssign overloads, and if we want to 
>>>> map opIndex to operator[], we must to do something with 
>>>> opIndexAssign.
>>>
>>> operator[] can be mapped to opIndex just fine, right? Only 
>>> opIndexAssign wouldn't be accessible from C++ via an 
>>> operator, but that's because the feature doesn't exist. We 
>>> can still call it via its name opIndexAssign.
>>>
>>>> operator< and operator> can't be mapped to D. Same for 
>>>> operator&.
>>>
>>> That's true. Maybe we can just live with pragma(mangle) for 
>>> them, but use D's op... for all others?
>>>
>>>> Binary arithmetic operators can't be mapped to D, if them 
>>>> implemented as static functions:
>>>>
>>>> Foo operator+(int a, Foo f); //unable to map it to D, 
>>>> because static module-level Foo opAdd(int, Foo) will not 
>>>> provide the same behaviour as operator+ in D.
>>>> Thus: C++ and D overloaded operators should live in 
>>>> different worlds.
>>>
>>> Can't we map both static and member operators to opBinary 
>>> resp. opBinaryRight members in this case? How likely is it 
>>> that both are defined on the C++ side, and if they are, how 
>>> likely is it that they will behave differently?
>>
>> opBinary(Right) is a template-functions. You can't add 
>> previous declaration for it to struct:
>>
>> //C++
>> struct Foo
>> {
>>    Foo operator+(const Foo&);
>> };
>>
>> Foo operator+(int, const Foo&);
>>
>> //D
>> extern(C++)
>> struct struct Foo
>> {
>>    Foo opBinary!"+"(const ref Foo); //???
>
> I see...
>
>> }
>>
>> Foo opBinary!"+"(int, const ref Foo); //???
>
> But this would of course be opBinaryRight, and inside struct 
> Foo.

What if
Foo operator+(const Bar&, const Foo&);?
Is it Foo.opBinaryRight, or Bar.opBinary, or both?


More information about the Digitalmars-d mailing list