Type converter from build in to user type

js.mdnq js_adddot+mdng at gmail.com
Fri Nov 30 05:11:21 PST 2012


On Friday, 30 November 2012 at 03:40:31 UTC, Ali Çehreli wrote:
> On 11/29/2012 07:24 PM, jerro wrote:
>> On Friday, 30 November 2012 at 02:59:06 UTC, js.mdnq wrote:
>>> I have a struct I am trying convert from int's to the type. 
>>> Since I
>>> can't add a opCast overload to an int I don't know how to do 
>>> it. My
>>> opCast convertors in my class do not work for the assignment 
>>> operator:
>>>
>>>
>>> class myType
>>> {
>>> opCast, opAssign
>>> }
>>>
>>> mytype = 3;
>>>
>>> Error that we can't convert an int to myType. While it's very 
>>> easy to
>>> go from a myType to whatever by writing a cast for it(in the 
>>> class),
>>> how do I go from an int to myType(in the class)?
>>>
>>> For example, I can do
>>>
>>> mytype = mytype.opCast(3);
>>> or mytype.opAssign(3);
>>>
>>> but these are too verbose to be useful.
>>
>> Why can't you use opAssign? This works fine:
>>
>> class A
>> {
>> void opAssign(int i)
>> {
>> writeln(i);
>> }
>> }
>>
>> auto a = new A();
>> a = 1; // prints 1
>>
>
> A complete example:
>
> import std.conv;
>
> class C
> {
>     int i;
>
>     this(int i)
>     {
>         this.i = i;
>     }
>
>     C opAssign(int i)
>     {
>         this.i = i;
>         return this;
>     }
>
>     int opCast(T : int)() const
>     {
>         return i;
>     }
> }
>
> void main()
> {
>     auto c = new C(42);
>     c = 43;
>     auto i = to!int(c);
>     assert(i == 43);
> }
>
> Ali

Thanks, I was using a generic opCast which was causing the 
problem. It must have gotten that way from other mistakes I was 
probably making.

C!T opAssign(T i) rather than C!T opAssign(T)(T i)

It thought the D compiler would automatically deduce the second 
case but I guess it's redundant.




More information about the Digitalmars-d-learn mailing list