On 6/20/11 7:14 AM, kenji hara wrote:
I have tried to conversion test.
----
import std.conv;

void main()
{
     tests1();
     tests2();
     testc1();
     testc2();
}

struct SS1{ ST1 opCast(T:ST1)(){ return ST1(); } }
struct ST1{  }
void tests1()
{
     SS1 s1;
     auto t1a = cast(ST1)(s1);       // ->  s1.opCast!ST1()
//  auto t1b = to!ST1(s1);          // NG
}

struct SS2{  }
struct ST2{ this(SS2 source){} }
void tests2()
{
     SS2 s2;
     auto t2a = cast(ST2)(s2);       // ->  ST2(s2) == ctor call
//  auto t2b = to!ST2(s2);          // NG
}

class CS1{ CT1 opCast(T:CT1)(){ return new CT1(); } }
class CT1{  }
void testc1()
{
     CS1 s1 = new CS1();
     auto t1a = cast(CT1)(s1);       // ->  s1.opCast!CT1()
     auto t1b = to!CT1(s1);
         // T toImpl(T, S)(S value) if (is(S : Object)&&  is(T : Object))
         // ->  cast(CT1)(s1)
         // ->  s1.opCast!CT1()
}

class CS2{  }
class CT2{ static CT2 opCall(CS2 source){ return new CT2(); } }
//class CT2{ this(CS2 source){} }   // Unfortunately, ctor is not
called by CastExp.
void testc2()
{
     CS2 s2 = new CS2();
     auto t2a = cast(CT2)(s2);       // ->  CT2(s2) == CT2.opCall(s2)
//  auto t2b = to!CT2(s2);          // compiled, but runtime error occurs
         // T toImpl(T, S)(S value) if (is(S : Object)&&  is(T : Object))
         // ->  cast(CT1)(s1)
         // ->  null
}
----

Some of thoughts of me:
1. std.conv.to should support built-in casting behavior, at least on
struct object.
    This feature was recently fixed. See bug5897.

Agreed. I simply forgot about that.

2. Using to!T() member function by std.conv.to is unnecessary feature,
because it can be replaced by opCast!T.

I think that's fine too.

3. For class object, I guess that is need to support 'Conversion
Interface that Intrude into TargetType'.
    I think 'conversion constructor call' is good fit to it.

Not sure I understand that.

Kenji, you may want to package your 1 and 2 into a pull request, and 3 in a separate pull request so we all can take a look.


Thanks,

Andrei

Reply via email to