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