Making external types available to mixins

Nicholas Wilson iamthewilsonator at hotmail.com
Thu Nov 22 21:39:56 UTC 2018


On Saturday, 17 November 2018 at 17:58:54 UTC, John Chapman wrote:
> The following code doesn't compile because the generated type 
> name needs to be available inside the mixin's scope, whereas 
> it's actually in another module.
>
> auto makeWith(string className, Args…)(auto ref Args args) {
>   mixin("return makeWith!(I", className, "Factory)(args);"); // 
> Fowarded to implementation of makeWith below
> }
>
> auto makeWith(T, Args…)(auto ref Args args) … // This is the 
> implementation
>
> The idea is that users could type (for example) 
> makeWith!`Calendar`(…) instead of the longer 
> makeWith!ICalendarFactory(…).
>
> I tried mixing in an import statement with the help of 
> std.traits.moduleName so that the I...Factory type would be 
> available but again the compiler complains that it's undefined.
>
> Has anyone had a similar need and come up with a solution?

you need to qualify the names: I use 
https://github.com/libmir/dcompute/blob/master/source/dcompute/driver/ocl/util.d#L77-L97
for this in dcompute (needs to be updated for the new style of 
mixin but you get the idea).


More information about the Digitalmars-d-learn mailing list