Accessing all data in TypeTupple (AliasSeq) and stringify them

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Feb 25 06:29:30 PST 2016


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


More information about the Digitalmars-d-learn mailing list