On Monday, 8 July 2013 at 11:56:40 UTC, JS wrote:

The following code inserts properties for each type,

auto name = "Value"~((i == 0) ? "" : to!string(i++));

always as the i == 0 evaluate to true.


My question is, why the heck is it so hard to use basic programming structs inside CTFE's? I know that CTFE's have to work at run time also, so there is a limitation, but:

1. obviously ints work because the code below works with i as a counter but we can't do a simple compare on it... this seems like a bug.

2. foreach can be used but a simple for loop can't... makes no sense.

I know what the average response is going to be but hopefully someone will surprise me with some useful.



mixin template PropertyBuilder(T...)
{
        template _(TT...)
        {
                static string eval()
                {
                        string s;
                        pragma(msg, TT);
                        int i = 0;
                        foreach(t; TT)
                        {
                                auto name = "Value"~((i > 0) ? "" : 
to!string(i++));
                                s = "@property "~t.stringof~" "~name~"();\n";
s ~="@property "~t.stringof~" "~name~"("~t.stringof~" value);\n";
                        }
                        return s;
                }
                enum _ = eval();
                pragma(msg, _);
        }

        mixin("mixin(_!T);");
        
}

interface a(MT...)
{
        mixin PropertyBuilder!MT;
}

after weeding out the bugs and unusual things, plus letting foreach manage i:

mixin template PropertyBuilder(T...)
{
        template _(TT...)
        {
                static string eval()
                {
                        string s;
                        foreach(i, t; TT)
                        {
                                auto name = "Value"~((i > 0) ? to!string(i) : 
"");
                                s ~= "@property "~t.stringof~" "~name~"();\n";
                                s ~="@property void "~name~"("~t.stringof~" 
value);\n";
                                
                        }
                        return s;
                }
                enum _ = eval();
        }

        mixin("mixin(_!T);");
}

which works fine.

The i++ in to!string not having any effect is rather surprising, I agree.

Reply via email to