Template type deduction and specialization

Daniel Kozak via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed May 20 02:35:42 PDT 2015


On Wednesday, 20 May 2015 at 09:24:28 UTC, Daniel Kozák wrote:
>
> On Wed, 20 May 2015 06:31:11 +0000
> Mike Parker via Digitalmars-d-learn 
> <digitalmars-d-learn at puremagic.com>
> wrote:
>
>> I don't understand why this behaves as it does. Given the 
>> following two templates:
>> 
>> ```
>> void printVal(T)(T t) {
>> 	writeln(t);
>> }
>> void printVal(T : T*)(T* t) {
>> 	writeln(*t);
>> }
>> ```
>> 
>> I find that I actually have to explicitly instantiate the 
>> template with a pointer type to get the specialization.
>> 
>> ```
>> void main() {
>> 	int x = 100;
>> 	printVal(x);
>> 	int* px = &x;
>> 	printVal(px);        // prints the address
>>          printVal!(int*)(px)  // prints 100
>> }
>> ```
>> 
>> Intuitively, I would expect the specialization to be deduced 
>> without explicit instantiation. Assuming this isn't a bug 
>> (I've been unable to turn up anything in Bugzilla), could 
>> someone in the know explain the rationale behind this?
>
> Because it cannot deduce type T:
>
> try this:
>
> void printVal(T : T*)(T* t) {
>     writeln(*t);
> }
>
> void main() {
>  	int x = 100;
>  	int* px = &x;
>  	printVal(px);
> }
>
> It will print error.
>
> My advise is not to use T:T* or T:T[] it works only when 
> explicitly
> instantiate. Is better use T:M*,M or T:M[], M because it works
> automaticly and you have both types available.
>
> import std.stdio;
>
> void printVal(T)(T t) {
>     writeln(t);
> }
>
> void printVal(T:M*,M)(T t) {
>     writeln(*t);
> }
>
> void main() {
>     int x = 100;
>     printVal(x);
>     int* px = &x;
>     printVal(px);        // prints the 100
> }

DOCS: http://dlang.org/template.html#function-templates
says: Function template type parameters that are to be implicitly 
deduced may not have specializations:


More information about the Digitalmars-d-learn mailing list