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