problem with template arguments deduction

Philippe Sigaud philippe.sigaud at gmail.com
Wed May 30 15:19:43 PDT 2012


I don't see anything wrong per se. It's mainly that the compiler type
extraction/deduction is not powerful enough to extract U in your case.
You can help it a bit by using std.traits.ParameterTypeTuple:

module test;

import std.stdio;
import std.traits;
import std.typetuple;

template Combination(alias indices,U...)
{
    static if(is(typeof(indices) : int[]))
    {
        static if(indices.length > 1)
            alias
TypeTuple!(U[indices[0]],Combination!(indices[1..$],U)) Combination;
        else static if(indices.length == 1)
            alias U[indices[0]] Combination;
    }
}

template bind(alias indices)
{
   static if(is(typeof(indices) : int[]))
   {
        auto bind(D,V...)(D dg, V values) if (is (D d == R
delegate(U), R, U...) && is(V == Combination!(indices,
ParameterTypeTuple!D)))
        {
/*                      static if(indices.length > 1)
                               return
bind!(update!(indices,indices[0]))(Curry!(indices[0])(dg,values[0]),values[1..$]);
                       else static if(indices.length == 1)
                               return Curry!(indices[0])(dg,values[0]);
*/

        }
    }
}

void main()
{
       void xyz(int x,int y,int z)
       {
               writeln("x = ",x," y = ",y," z = ",z);
       }
//      auto g = Curry!1(&xyz,cast(int)(1.1));
//      g(2,3);
       alias Combination!([0,1],int,int,int) Arg;
       Arg a;
       writeln(Arg.stringof);
       bind!([0,1])(&xyz,a);
       //readln();
}


More information about the Digitalmars-d-learn mailing list