| Thread overview |
|---|
December 17, 2012 alias this/opGet and opCast conversion | ||||
|---|---|---|---|---|
| ||||
This i probably a rather dumb question but I've been up all night and therefor have a really good excuse ;) (I can barely see straight...)
Is opGet the reverse opAssign? I can't find any docs on it but it does let me write converters from my type to another type.
e.g.,
struct X { int value; }
double x = xX;
without an opGet or alias this I get an error about not being able to implicitly convert. Using alias this solves the problem. Using opGet seems to let me write a converter(which I can't seem to do otherwise).
For example, it seems I could use opGet to normalize X's value when converting to a double.
That is, the way I see it is
double x = xX;
The compiler checks to see if double has an opAssign that will convert X to a double. If not it checks if X has an opGet call(a sort of reverse opAssign).
Is this the correct understanding of opGet or is there more too it.
What if I have
struct X { int value; X opAssign(Y y); }
struct Y { double value; X opGet(); alias opGet this; }
then
X x; Y y;
what does
x = y;
y = x;
do?
It seems the first will call X's opAssign and Y's opGet unless there is precedence? y = x will fail with the implicit conversion error?
| ||||
December 17, 2012 Re: alias this/opGet and opCast conversion | ||||
|---|---|---|---|---|
| ||||
Posted in reply to js.mdnq | On Monday, 17 December 2012 at 15:10:24 UTC, js.mdnq wrote: > This i probably a rather dumb question but I've been up all night and therefor have a really good excuse ;) (I can barely see straight...) > > > Is opGet the reverse opAssign? I can't find any docs on it but it does let me write converters from my type to another type. > > e.g., > > struct X { int value; } > > double x = xX; > > without an opGet or alias this I get an error about not being able to implicitly convert. Using alias this solves the problem. Using opGet seems to let me write a converter(which I can't seem to do otherwise). > > For example, it seems I could use opGet to normalize X's value when converting to a double. > > That is, the way I see it is > > double x = xX; > > The compiler checks to see if double has an opAssign that will convert X to a double. If not it checks if X has an opGet call(a sort of reverse opAssign). > > Is this the correct understanding of opGet or is there more too it. > > What if I have > > struct X { int value; X opAssign(Y y); } > struct Y { double value; X opGet(); alias opGet this; } "opGet" is not a special name. The magic comes from alias this. You can use another name just fine. > > then > > X x; Y y; > > what does > > x = y; > y = x; > > do? > > It seems the first will call X's opAssign and Y's opGet unless there is precedence? I guess opAssign wins, because alias this is only considered if it doesn't work out with the original type. > y = x will fail with the implicit conversion error? Yes, assigning x directly to y doesn't work, and assigning it to y.opGet (via alias this) doesn't work either, so it fails. | |||
December 17, 2012 Re: alias this/opGet and opCast conversion | ||||
|---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Monday, 17 December 2012 at 15:46:22 UTC, anonymous wrote: > On Monday, 17 December 2012 at 15:10:24 UTC, js.mdnq wrote: >> This i probably a rather dumb question but I've been up all night and therefor have a really good excuse ;) (I can barely see straight...) >> >> >> Is opGet the reverse opAssign? I can't find any docs on it but it does let me write converters from my type to another type. >> >> e.g., >> >> struct X { int value; } >> >> double x = xX; >> >> without an opGet or alias this I get an error about not being able to implicitly convert. Using alias this solves the problem. Using opGet seems to let me write a converter(which I can't seem to do otherwise). >> >> For example, it seems I could use opGet to normalize X's value when converting to a double. >> >> That is, the way I see it is >> >> double x = xX; >> >> The compiler checks to see if double has an opAssign that will convert X to a double. If not it checks if X has an opGet call(a sort of reverse opAssign). >> >> Is this the correct understanding of opGet or is there more too it. >> >> What if I have >> >> struct X { int value; X opAssign(Y y); } >> struct Y { double value; X opGet(); alias opGet this; } > > "opGet" is not a special name. The magic comes from alias this. You can use another name just fine. > Thanks, that makes sense... no wonder I couldn't find it. >> >> then >> >> X x; Y y; >> >> what does >> >> x = y; >> y = x; >> >> do? >> >> It seems the first will call X's opAssign and Y's opGet unless there is precedence? > > I guess opAssign wins, because alias this is only considered if it doesn't work out with the original type. That might be ok because chances are X will not have an opAssign for Y anyways as long as opGet is not called first. Hence opGet should only be called which is what I want. I guess the real problem is that if X does know about Y and has an opAssign for it then there is trouble because opAssign might not convert the value the way I want it to(which is why I'm using opGet). >> y = x will fail with the implicit conversion error? > > Yes, assigning x directly to y doesn't work, and assigning it to y.opGet (via alias this) doesn't work either, so it fails. Thanks | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply