std.typecons.Proxy + inheritance breaks cast'ing to inherited type

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Mar 17 00:56:19 PDT 2015


On 03/17/2015 12:14 AM, Meta wrote:

 > On Tuesday, 17 March 2015 at 05:32:49 UTC, Ali Çehreli wrote:
 >> On 03/16/2015 04:59 PM, Lukasz Wrzosek wrote:
 >>> Bug reported as
 >>> https://issues.dlang.org/show_bug.cgi?id=14298
 >>
 >> Thanks...
 >>
 >> I have carried the discussion over to the main newsgroup:
 >>
 >>   http://forum.dlang.org/thread/me8e0a$1kp6$1@digitalmars.com
 >>
 >> As I mention there, there is a workaround: Add a catch-all opCast to
 >> the class in question, which can simply forward to the all-powerful
 >> std.conv.to:
 >>
 >>     T opCast(T)()
 >>     {
 >>         import std.conv;
 >>         return this.to!T;
 >>     }
 >>
 >> Now it compiles and works as expected.
 >>
 >> Ali
 >
 > That will throw an exception if the conversion can't be done instead of
 > just returning null, won't it?

You are right. I did not think it through but we can add template 
constraints to make it impossible to throw. (Still, we shouldn't need to 
do that for a cast to base types.)

 > Why can't you do this instead?
 >
 > t opCast(t)()
 > if (is(typeof(cast(T)this)))
 > {
 >      return cast(T)this;
 > }

That has the same problem: 'cast(T)this' happens to be an explicit cast, 
which is disabled by the opCast overload for int.

Ali



More information about the Digitalmars-d-learn mailing list