Eponymous template with static if

Tejas notrealemail at gmail.com
Mon Aug 14 03:18:17 UTC 2023


On Thursday, 10 August 2023 at 14:34:20 UTC, Michael Galuza wrote:
> On Wednesday, 9 August 2023 at 18:28:38 UTC, sighoya wrote:
>> Giving it an explicit type make it workable
>
> Of course, but such usage of a template functions is... 
> useless:-) I want type argument `T` will be inferred.
>
> Anyway, I wondered why compiler rewrite `square!(int)(3)` as 
> `square!(int).square(3)`, but in the same time it's not so 
> clever to eliminate `!(int)`. I can only guess that type 
> inference is impossible in this situation. I mean in ordinary 
> cases compiler can match literal `3` and type `int` directly, 
> but what it should do in such simple case:
> ```
> template square(T) {
>     static if (is(T)) {
>         T square(T t) {
>             return t * t;
>         }
>     }
> }
> ```
> Of course compiler could conclude that expression `square(3)` 
> is correct only if `static if` branch was successful, so `is(T) 
> == true && T == int` (hi, Hindley–Milner :-), but such type 
> inference require complex analysis "bottom-up", from template 
> members to template itself, whereas we analyse template body 
> "up-down", from template args and static if-s to members.
>
> Of course all above is just my poor and miserable tryings to 
> understand compiler's pranks, don't judge me.


D has [template 
constraints](https://dlang.org/spec/template.html#template_constraints) that will do that for you(but I don't think it works when you explicitly use `template` keyword):
```d
import std;


T square(T)(T param)if(is(T == int)){
     return param * param;
}



void main()
{
     writeln(square(123));
}
```

And if you want to use templates explicitly, you can use template 
specialization:
```d
import std;

template square(T:int){
     T square(T param){
     return param * param;
     }
}


void main()
{
     writeln(square(123));
}
```

And, as you mentioned already, getting the compiler to deduce the 
kind of types
that are valid for a given template body is not possible right 
now.


More information about the Digitalmars-d mailing list