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. :)

Reply via email to