On Thursday, June 07, 2012 16:47:08 Manu wrote:
> Seriously?
> 
> I perceive to!T and cast(T) as fundamentally different operations. How can
> opCast correctly perform the role of to! ?
> cast() is a low level type cast, to! implies a conversion of some kind. If
> you have a pointer type, I assume cast to operate on the pointer, and to!
> to perform a conversion of the thing it represents.
> 
> to!int("12345")  or  cast(int)"12345"
> to!JSONValue(obj)  or  cast(JSONValue)obj
> cast(string)obj  <- appears to be a primitive cast operator, communicates
> nothing to me about the expected format of the string produced
> 
> The cast approach feel really wrong to me...
> 
> I need to do conversion between some fairly complex types. to! feels
> appropriate, but cast() just seems weird...
> Have I missed something?

As the documentation says:

$(RED Deprecated. It will be removed in August 2012. Please define $(D opCast)
      for user-defined types instead of a $(D to) function.
      $(LREF to) will now use $(D opCast).)

Previously, you defined a to function on your type to make it work with 
std.conv.to. Now, you define opCast. It allows std.conv.to to work with your 
custom opCasts and avoids issues like if you have both opCast and to defined on 
your type for the same conversion. As it's a user-defined opCast, rather than 
the built-in one, it's as safe as any function doing such a conversion would 
be. So, defining such an opCast is just fine, and it means that you can now use 
that opCast with std.conv.to instead of casting, which reduces the odds of 
something going wrong like having screwed up the the opCast declaration (e.g. 
opcast instead of opCast) and having the compiler use the built-in cast when 
you tell it to cast.

This change isn't asking you to use an explicit cast. It's merely asking you 
to define opCast rather than your own to in order to get your type to work with 
std.conv.to.

- Jonathan M Davis

Reply via email to