alias this/opGet and opCast conversion

js.mdnq js_adddot+mdng at gmail.com
Mon Dec 17 15:16:02 PST 2012


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


More information about the Digitalmars-d-learn mailing list