Thread overview
Template specialization question
Nov 24, 2016
ag0aep6g
Nov 24, 2016
Stefan Koch
November 24, 2016
void foo(T)(T t){writeln("a");}
void foo(T...)(T t){writeln("b");}

foo(1);

Compiles? If so, which prints out?

I was surprised by the answer. I can't find docs for it. Is the behavior intended?

-Steve
November 24, 2016
On 11/24/2016 06:47 PM, Steven Schveighoffer wrote:
> void foo(T)(T t){writeln("a");}
> void foo(T...)(T t){writeln("b");}
>
> foo(1);
>
> Compiles? If so, which prints out?
>
> I was surprised by the answer. I can't find docs for it. Is the behavior
> intended?

Took me a bit to find it, but it is documented:

"If both a template with a sequence parameter and a template without a sequence parameter exactly match a template instantiation, the template without a TemplateSequenceParameter is selected."

https://dlang.org/spec/template.html#variadic_template_specialization
November 24, 2016
On Thursday, 24 November 2016 at 17:47:04 UTC, Steven Schveighoffer wrote:
> void foo(T)(T t){writeln("a");}
> void foo(T...)(T t){writeln("b");}
>
> foo(1);
>
> Compiles? If so, which prints out?
>
> I was surprised by the answer. I can't find docs for it. Is the behavior intended?
>
> -Steve

That is expected.
The general rule is go for the narrowest match.
Since a matches a smaller set then b.
a is selected.
November 24, 2016
On Thursday, 24 November 2016 at 17:59:55 UTC, ag0aep6g wrote:
>
> Took me a bit to find it, but it is documented:
>
> "If both a template with a sequence parameter and a template without a sequence parameter exactly match a template instantiation, the template without a TemplateSequenceParameter is selected."
>
> https://dlang.org/spec/template.html#variadic_template_specialization


Thanks. I did not find this! You learn something new about D every day

-Steve