<div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, May 21, 2019 at 7:55 AM Jim via Digitalmars-d-learn <<a href="mailto:digitalmars-d-learn@puremagic.com">digitalmars-d-learn@puremagic.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
Question: How to call foo.x in @safe code ?<br></blockquote><div>@safe:</div><div>interface Base</div><div>{</div><div>   void setup();</div><div>}</div><div><br></div><div>interface FeatureX</div><div>{</div><div>   void x();</div><div>}</div><div><br></div><div>interface FeatureY</div><div>{</div><div>   void y();</div><div>}</div><div><br></div><div><br></div><div>class Foo: Base, FeatureX</div><div>{</div><div>   void setup(){};</div><div>   void x(){};</div><div>}</div><div><br></div><div>D castHelper(D, S)(S s) @trusted</div><div>if ((is(S == interface) || is(S == class)) && (is(D == interface) || is(D == class))) </div><div>{</div><div>    import std.traits;</div><div>    D d = cast(D)s;</div><div>    if (d) return d;</div><div>    else assert(0, fullyQualifiedName!S ~ " does not inherit from " ~ fullyQualifiedName!D);</div><div>}</div><div><br></div><div>void main()</div><div>{</div><div>   auto foo = new Foo(); // This would be the result of a factory </div><div><br></div><div>   castHelper!FeatureX(foo).x;</div><div>} </div></div></div></div>