Variadic Templates or functions with Lazy Evalutaion
Daniel919
Daniel919 at web.de
Tue Aug 14 16:39:28 PDT 2007
void test(T)(lazy T arg)
{
writefln(arg);
}
test("abc");
is converted to:
void test(string delegate() arg)
{
writefln(arg);
}
test({return "abc"});
So we have:
string delegate() arg = {return "abc"};
And this is related to bug #1371:
//string delegate() dg = { return "dg"; };
//Error: functions cannot return static array invariant char[2u]
string delegate() dg = delegate string() { return "dg"; }; //OK
auto dg = { return "dg".dup; }; //OK
string fn() { return "fn"; }; //OK
However this is working:
void test(T)(lazy T arg)
{
writefln(arg);
}
test("abc".dup);
For simple logging you could also use this:
void log(args...)() {
if (args[0] > 1)
writefln(args[1..$]);
}
log!(2, "abc", "def")();
Remember that you can't use runtime functions/data then:
log!(2, runtimeprocessingfunction("abc"));
//Error: cannot evaluate runtimeprocessingfunction("abc") at compile time
log!(2, compiletimefunction("abc")); //OK
Best regards,
Daniel
More information about the Digitalmars-d-learn
mailing list