digitalmars.D.learn - Iterating over mixin template members
- Hipreme (46/46) Jul 28 2022 So, I've came to a situation where I must use mixin template for
So, I've came to a situation where I must use mixin template for 
defining members overloads, like:
```d
mixin template OverloadGen()
{
     static if(hasMethod!(typeof(this), "add", int, int))
     {
         float add(float x, float y){return x+y;}
     }
     static if(hasMethod!(typeof(this), "mul", int, int))
     {
         float mul(float x, float y){return x*y;}
     }
}
```
I know this example is obvious, but I'm using this for a far more 
complex, so I need that to work.
The current way I tried to solve that was using string mixins 
such as:
```d
enum mixOverloadGen()
{
     return q{
         mixin OverloadGen __ogen__;
         static foreach(mem; __traits(allMembers, __ogen__))
         {
             mixin("alias ",mem," = __ogen__.",mem,";");
         }
     };
}
class Tester
{
     int add(int, int){return 0;}
     mixin(mixOverloadGen);
}
```
The problem doing that is that I can have access to `__ogen__`, 
which makes code like that valid: `tester.__ogen__.add`. I can't 
make `private mixin OverloadGen __ogen__`, because I won't be 
able to publicly access my overloads.
And doing `static foreach(mem; mixin OverloadGen)` is also 
invalid, tried with allMembers, so, this is my current solution, 
the other thing I could do is instead of aliasing to the mixin 
members, I could make them private and declare a public function 
inside my string mixin which calls those, which is just wasteful: 
increase compile time, runtime usage and code complexity.
 Jul 28 2022








 
  
  
  Hipreme <msnmancini hotmail.com>
 Hipreme <msnmancini hotmail.com>