Anybody have any idea on how to do shared operator overloads?
Tejas
notrealemail at gmail.com
Thu Jun 2 03:58:28 UTC 2022
On Thursday, 2 June 2022 at 01:49:32 UTC, Ruby The Roobster wrote:
> On Thursday, 2 June 2022 at 01:29:39 UTC, Ruby The Roobster
> wrote:
>> On Thursday, 2 June 2022 at 01:00:57 UTC, Ali Çehreli wrote:
>>> On 6/1/22 17:36, Ruby The Roobster wrote:
>>> > A stripped down version of some code I have:
>>>
>>> Not much experience here but I made two changes:
>>>
>>> 1) Added 'shared':
>>>
>>> > this(Complex!real num = Complex!real(0,0)) shared
>>> > {
>>> > this.num = num;
>>> > }
>>> > this(shared Complex!real num = cast(shared
>>> > Complex!real)Complex!real(0,0))
>>> > {
>>> > this.num.re = num.re;
>>> > this.im.re = im.re;
>>>
>>> 2) Fixed apparent typos:
>>>
>>> this.num.im = num.im;
>>>
>>> > }
>>>
>>> I can't guarantee that correct functions are called. It just
>>> compiles with 2.100.0. :)
>>>
>>> Ali
>>
> Yes, those were typos. However, when making this post, I
> forgot to mark ```this(shared Complex!real num = cast(shared
> Complex!real)Complex!real(0,0))``` as shared. The other
> constructor is not marked as shared in my code, considering as
> shared classes have all of their members marked as shared.
>
> I also have a bug: __traits(compiles) only checks if the
> expressions are SEMANTICALLY correct, not if they actually
> compile, which they don't.
>
> Interestingly, this code compiles between 2.063 and 2.066.1, if
> you were to put it into run.dlang.io, given the above changes
> (including the p1 + p2!), and set to all compilers.
I fixed the typos and added some extra constructors and also
wrote a little more complex `opBinary` for the `shared` overload
of `Number`. Now the thing works(AFAICT):
```d
public import std.complex;
public import std.stdio;
public interface Mtype
{
// ...
}
public class Number : Mtype
{
public:
// new code begin
this()
{
this.num = Complex!real(1,1);
}
this() shared
{
this.num = Complex!real(1,1);
}
// new code ends
this(Complex!real num = Complex!real(0,0))
{
this.num = num;
}
this(shared Complex!real num = cast(shared
Complex!real)Complex!real(0,0)) shared
{
this.num.re = num.re;
this.num.im = num.im;
}
Number opBinary(string op)(Number rhs) //Standard opBinary
{
mixin("return new Number(this.num " ~ op ~ "
rhs.num);");
}
shared(Number) opBinary(string op)(shared Number rhs)
shared
//changed this code a little as well
{
mixin(q{return new shared
Number(Complex!real(this.num.re} ~ op ~ q{rhs.num.re,
this.num.im} ~ op ~ q{rhs.num.im));}); //Placeholder untill I can
get the code to work
}
package:
Complex!real num;
}
bool isMtype(T)()
{
bool ret = true;
// ...
shared T p = new shared T();
shared T p2 = new shared T();
ret &= __traits(compiles, T, p + p2);
return ret;
}
static assert(isMtype!Number); //This fails. Not anymore :D
void main()
{
shared num1 = new shared Number();
shared num2 = new shared Number();
auto num3 = num1 + num2;
writeln("real: ", num3.num.re, "\nimaginary: ",num3.num.im);
}
```
More information about the Digitalmars-d-learn
mailing list