On Tuesday, 10 September 2013 at 16:00:55 UTC, Paolo Invernizzi
wrote:
Johannes Pfau wrote something like this, in the logger thread:
If you write code like this:
void log(string file = __FILE__)() //A template
{
logImpl(file);
}
void logImpl(string file){} //Not a template
The compiler can always inline the log template. So there's no
template bloat as there will be effectively no instances of log.
Instead it will be inlined and logImpl will be called directly
just as
if you manually called logImpl(__FILE__).
I'm trying something like that, but with __LINE__ in addition
to put a little more pressure:
void log(string file = __FILE__, int line = __LINE__)(){
logImpl(file, line); }
void logImpl(string file, int line){}
I've then compiled a single file filled with 'log()', but I've
found from 'nm' that the text section is still full of
templated functions.
So the question is: is Johannes trick supposed to work, or
there's something I don't understand well about template
expansion and inlining?
Thanks, Paolo
Johannes was wrong. DMD will always emit template symbols, even
if those are completely inlined. Basically, anything that is
somehow referenced in D modules gets into object file.
Why won't you use default parameters in normal functions:
void log(string file = __FILE__, int line = __LINE)
{
// ...
}
It uses caller context for token substitution, not declaration
one.