Strange Mixin issue
    Ali Çehreli 
    acehreli at yahoo.com
       
    Wed Mar  5 15:04:05 PST 2014
    
    
  
On 03/05/2014 02:37 PM, Frustrated wrote:
 >> import std.typetuple;
 >>
 >> template fooImpl(T...)
 >> {
 >>     static assert(is (T[0] == S));    // <-- COOL!
 >>     static assert(is (T[1] == int));
 >>     static assert(is (T[2] == double));
 >> }
 >>
 >> template foo(T...)
 >> {
 >>     alias foo = fooImpl!(TypeTuple!(typeof(this), T));
 >> }
 >>
 >> struct S
 >> {
 >>     mixin foo!(int, double);
 >> }
 >>
 >> void main()
 >> {
 >>     auto s = S();
 >> }
 >>
 >> Ali
 >
 > this is not quite the same.
I think you tried to give a link in your original code but it is 
missing. Still, it is very difficult for me to follow code unless it is 
really simple. :)
 > You have static asserts.
Just to prove that I've managed to inject typeof(this) as the first 
template parameter.
 > I'm trying to avoid
 > mixing in ctfe code that might interfer with the class. (I have a temp
 > function Do which if I mixin as a normal template will mixin Do into the
 > class make Do a member of that class)
The following is what I understand so far. :) The last line of main() 
proves that S gained a function Do() that takes (int, double) parameters.
import std.typetuple;
template DoImpl(T...)
{
     auto Do(T[1] p1, T[2] p2)
     {
         return p1 + p2;
     }
}
template Do(T...)
{
     mixin DoImpl!(TypeTuple!(typeof(this), T));
}
struct S
{
     mixin Do!(int, double);
}
void main()
{
     auto s = S();
     assert(s.Do(1, 2.5) == 3.5);
}
Ali
    
    
More information about the Digitalmars-d-learn
mailing list