On Thursday, 1 August 2013 at 21:17:34 UTC, H. S. Teoh wrote:
On Thu, Aug 01, 2013 at 10:06:54PM +0200, JS wrote:
[...]
Now are you telling me that
template A()
{
void foo() { writeln("asdf"); }
}
void main()
{
A!().foo();
}
does not create a function foo in the binary? That it is
equivalent
to just calling writeln("asdf"); directly? (exact same code)
[...]
I said that every instantiation of a template creates a copy of
everything inside. Therefore, A!().foo() will create a copy of
A.foo()
in the binary.
The template itself has no binary representation, in the sense
that if
you write:
template A(int x) {
void foo() { writeln(x); }
}
there is nothing in the binary corresponding with the template
A, or the
uninstantiated function foo. But if you instantiate A with some
value of
x, then you will get a copy of A.foo for every value of x that
you
instantiate the template with. So if you write:
A!1.foo();
A!2.foo();
A!3.foo();
Then you will get 3 copies of foo() in your executable, one for
each
value of x.
yes, I understand that... now use a template for a string
mixin!!!!!
template A()
{
string A() { ... }
}
...
mixin(A());
IS A GOING TO BE IN THE BINARY?!?!?! Yes, I'm yelling... just to
get the point across about the question I'm trying to get
answered.
the function A is never used at runtime SO it should technically
not be in the binary UNLESS dmd treats it as a normal template
function then it will(but shouldn't)!
e.g.,
if the compiler smart enough to realize that A(); is different
from mixin(A());
(one being compile time and the other not)