Template with equivalent function names
Andrej Mitrovic
andrej.mitrovich at gmail.com
Mon Aug 16 07:05:03 PDT 2010
Ah, you're right it does mention it, it was further down below from that template function. Thanks guys.
Simen kjaeraas Wrote:
> Andrej Mitrovic <andrej.mitrovich at gmail.com> wrote:
>
> > This isn't a question but more of an observation. Here's an interesting
> > template from the docs:
> >
> > template Foo(T, R...)
> > {
> > void Foo(T t, R r)
> > {
> > writeln(t);
> > static if (r.length) // if more arguments
> > Foo(r); // do the rest of the arguments
> > }
> > }
> >
> > void main()
> > {
> > Foo(1, 'a', 6.8);
> > }
> >
> > What really intrigues me here is not the tuples which I already get, but
> > the fact that Foo is a function template. But if I remove the inner
> > Foo() function then it's not a function template anymore so the call in
> > main won't work. The inner function must have the same name as the
> > template, apparently (it doesn't even state this in the docs from what I
> > can tell!).
>
> It is in fact mentioned, but not touted as an impressive feature:
>
> "If a template declares exactly one member, and that member is a function
> with the same name as the template, it is a function template
> declaration."[1]
>
> The same is true for struct, union, and class templates, as well as
> 'Implicit Template Properties', meaning any template with exactly one
> member, if that member has the same name as the template itself.
>
> In fact, shorthand eponymous templates, like struct foo(T){} or
> void bar(T)(); translate internally to template foo(T){ struct foo{} }
> and template bar(T){ void bar(){} }.
>
> Other common patterns used with this trick are compile-time constants:
>
> template foo!(int n) {
> enum foo = n;
> }
>
> and alias types:
>
> template foo(int n, T...) {
> alias T[n] foo;
> }
>
> [1]: http://www.digitalmars.com/d/2.0/template.html#function-templates
>
> --
> Simen
More information about the Digitalmars-d-learn
mailing list