anyway to pass the context of an inner type to a template so it can be constructed?

Timoses timosesu at gmail.com
Wed Jun 27 19:28:37 UTC 2018


On Wednesday, 27 June 2018 at 12:02:10 UTC, aliak wrote:
> This currently fails unless you mark the class as static:
>
> auto construct(T)() {
>     return new T;
> }
> void main() {
>     class C {}
>     auto s = construct!C;
> }
>
> So wondering if there's anything that can be done to get the 
> above working?
>
>
> Or if there isn't then how could the compiler be enhanced to 
> allow for something like this if possible?
>
> ===
> The use case is for a non-nullable type, where I want to 
> guarantee that the value inside will never be null. I can't do 
> it for inner classes though. And I can't allow the user to do 
> something like:
>
> void main() {
>     class C {}
>     auto s = construct(new C);
> }
>
> Because I can't guarantee that's not null.
>
>
> Cheers,
> - Ali

After a bit of experimentation

     import std.stdio;
     template construct1(T)
     {
         enum construct1 = "new " ~ T.stringof;
     }

     template construct2(T)
     {
         // Attempt 1
         // can't do this : /
         //alias construct2 = mixin(construct1!T);

         // Attempt 2
         T construct2()
         {
             // Error: outer function context of D main is needed 
to new nested class onlineapp.main.C
             //return new T;

             // Error: undefined identifier C
             //mixin("return new " ~ T.stringof ~ ";");

             return null; // ...
         }
     }

     mixin template construct3(string s, T)
     {
         mixin("auto " ~ s ~ " = new " ~ T.stringof ~ ";");
     }

     void main() {
         class C { int i = 4;}

         auto a = mixin(construct1!C);
         assert(a.i == 4);

         mixin construct3!("b", C);
         b.i = 3;	
         assert(b.i == 3);

         // trying to get around using mixin here...
         auto c = construct2!C;
     }


Can't seem to avoid using mixin in main..


More information about the Digitalmars-d-learn mailing list