return type and templates

Jonathan M Davis jmdavisProg at gmx.com
Fri Nov 22 05:43:47 PST 2013


On Friday, November 22, 2013 14:29:46 Timon Gehr wrote:
> The request would be reasonable if 'value' was declared as follows though:
> 
> @property T value(T)() if (is(T == int)) { return _intValue; }
> 
> i.e. the fact that the template argument equals the type of the
> resulting call can be read off directly from the signature. This is in
> the same ballpark as the existing IFTI features.

How so? IFTI works by inferring the template arguments from the function 
arguments. In this case, for the compiler to figure out a type that it could 
use to instantiate the template, it would have to disect the template 
constraint, which is compeletly different. Yes, this particular template 
constraint is very simplistic, but the compiler doesn't even look at the 
template constraint until it has a type to test with it, and in most cases, it 
would have no way of inferring what types might work even if it did look.

Trying to get the compiler to infer T for value would be a drastic change to 
how it deals with templates, and at best, it would be able to figure out what 
to do in only the most simplistic of cases. In fact, the only cases that it 
could figure it out would very simplistic cases where there was only one 
possible answer, and if there's only one type that will work with a template, 
then there really wasn't much point in templatizing it in the first place. And 
as soon as there are multiple types which could work with a template, the 
compiler couldn't figure out the correct type no matter how smart it was, 
because it would need a way of choosing which of the options to take. e.g.

template foo(T)
     if(is(T == int) || is(T == byte))
{
    ...
}

Should foo be instantiated with int or byte? Both are equally valid.

The OP has come up with a contrived example where it seems obvious to him what 
type the compiler should use to instantiate a template which has been given no 
template arguments and no function arguments to infer the template arguments 
from. But the compiler has no plumbing for figuring out such a thing, and 
adding such plumbing would be pointless, because it would only work in 
contrived cases such as this one where there was no point in templatizing the 
function in the first place.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list