On Thursday, 25 February 2016 at 13:16:43 UTC, Voitech wrote:
Hi, I have some code processing functions definition in compile time, I want to override them in some other class but not explicitly so created this code:

template MixinFunction(alias attributes,alias returnType,alias name,alias parameters,alias bodyy){

        enum string MixinFunction = format(q{
                        %s %s %s(%s){

                                %s

                        }

                },attributes,returnType,name,parameters,bodyy);
}
unittest{
alias func=MixinFunction!("static","void","testFunc","int a,int b",q{

                        import std.stdio;
                        writeln("im void body");

                });
        pragma(msg,func);
        mixin(func);
}

Now i acquired all data like return type, parameters but need to turn them into string for example function parameters must have form of:

for function func:
void func(int a,string b){}

alias parameters=Parameters!func;

returns me AliasSeq!(int,string)
I want to to turn them into string: like "int param0, string param1", but in template

    template AliasSeqToString(TList...){

        enum AliasSeqToString= ... //each ?


    }
How to operate on TypeTuple/AliasSeq elemens withouth foreach ?

You can (see std.meta/(std.traits?) , with recursive templates), but there is nothing stopping from using for/foreach in a template

this should do what you want
string[] functionSig;
string[] params;
foreach(s; Parameters!T)) // returns AliasSeq of types
 {
       params ~=s.stringof;
 }
  string[] pits;
foreach(p; ParameterIdentifierTuple!(T)); // returns AliasSeq of strings
{
           pits ~=p;
}
and the either join(er) or do as you see fit.
or use plain old for
for(auto i=0;i< pits.length; i++)
{
     functionSig ~= params[i];
     functionSig ~= pits[i];
}
writeln(functionSig);
// should print ["int" , "param0" , "string" , "param1"]

Nic

Reply via email to