Strange Mixin issue

Frustrated Frustrated at nowhere.com
Wed Mar 5 15:10:22 PST 2014


On Wednesday, 5 March 2014 at 23:04:06 UTC, Ali Çehreli wrote:
> 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

And this is exactly what I don't what! Do, in my case, is a ctfe 
used only at compile time to make it easy to generate code. It's 
not needed at runtime and does not belong anywhere.


More information about the Digitalmars-d-learn mailing list