best replacement for - cout << "hello D" << endl; ?
Jarrett Billingsley
kb3ctd2 at yahoo.com
Wed Jul 11 20:10:13 PDT 2007
"Bruce Adams" <tortoise_74 at ya.nos.pam.hoo.co.uk> wrote in message
news:f7445a$1g7g$1 at digitalmars.com...
> I see. That makes quite a lot of difference. Now is there a way to remove
> the format string entirely.
> a) as a function
> b) as a template that can be expanded at compile time.
>
> It sounds like its trivial to write a) if it doesn't already exist.
> Hopefully, it does though.
Bill showed one way to do it with writefln, which still happens all at
runtime. Another way is with variadic templates:
void myWritefln(T...)(T args)
{
foreach(arg; args)
writef("%s", arg);
writefln();
}
myWritefln("Hi! ", 5, " that's all.");
There are a few things to note about this:
1) That foreach loop in the function is actually run at compile time and
unrolled; if you call this function with three arguments, the body will be
repeated three times, once for each argument.
2) You don't necessarily have to use writef[ln]() on the inside; you could
use this to wrap Tango-style (blah)(x) output in a more natural-looking
function call.
3) The issue with this is code bloat -- an instance of this template is
created for each separate list of parameter types.
(But ignoring the code bloat, it's just too damn cool of a feature not to
use it ;) )
Furthermore some people (as has been mentioned in this thread) have been
working on compile-time formatting which checks that the formatting strings
match up, typewise, with their arguments.
More information about the Digitalmars-d-learn
mailing list