On Thursday, 17 January 2019 at 20:47:38 UTC, Steven
Schveighoffer wrote:
well, there was no static foreach for that article (which I
admit I didn't read, but I know what you mean).
But it's DEFINITELY not as easy as it could be:
import std.conv;
alias AliasSeq(P...) = P;
template staticMap(alias Transform, Params...)
{
alias seq0 = Transform!(Params[0]);
static foreach(i; 1 .. Params.length)
{
mixin("alias seq" ~ i.to!string ~ " = AliasSeq!(seq" ~
(i-1).to!string ~ ", Transform!(Params[" ~ i.to!string ~
"]));");
}
mixin("alias staticMap = seq" ~ (Params.length-1).to!string
~ ";");
}
alias Constify(T) = const(T);
void main()
{
alias someTypes = AliasSeq!(int, char, bool);
pragma(msg, staticMap!(Constify, someTypes)); //
(const(int), const(char), const(bool))
}
Note, that this would be a LOT easier with string
interpolation...
mixin("alias seq${i} = AliasSeq!(seq${i-1},
Transform!(Params[${i}]));".text);
-Steve
Why not do away with AliasSeq and use strings all the way?
string Constify(string type)
{
// can add input checks here
return "const(" ~ type ~ ")";
}
void main()
{
import std.algorithm : map;
enum someTypes = ["int", "char", "bool"];
enum constTypes = map!Constify(someTypes);
mixin(constTypes[0] ~ "myConstInt = 42;"); // int myConstInt
= 42;
}
Represent types as strings, CTFE them as you see fit, and output
a string that can then be mixin'ed to use the actual type. :)