Thread overview
Implicit fn template instantiation
Mar 24, 2006
anthony.difranco
Mar 24, 2006
Sean Kelly
Mar 24, 2006
BCS
Mar 24, 2006
Oskar Linde
Mar 27, 2006
anthony.difranco
March 24, 2006
Can someone explain why I can't instantiate this template implicitly andor comment on whether I'm overlooking a better way to accomplish what this template does?

template increment(T, K)
{
void increment(T[K] association, K key)
{
if(key in association)
{
association[key]++;
}
else
{
association[key] = 1;
}
}
}

Thanks,
Anthony


March 24, 2006
anthony.difranco@yale.edu wrote:
> Can someone explain why I can't instantiate this template implicitly andor
> comment on whether I'm overlooking a better way to accomplish what this template
> does?

Mostly because ITI is still incomplete.  Anything beyond strict type replacement doesn't really work.


Sean
March 24, 2006
In article <dvvk0i$2tum$1@digitaldaemon.com>, anthony.difranco@yale.edu says...
>
>Can someone explain why I can't instantiate this template implicitly andor comment on whether I'm overlooking a better way to accomplish what this template does?
>
>template increment(T, K)
>{
>void increment(T[K] association, K key)
>{
>if(key in association)
>{
>association[key]++;
>}
>else
>{
>association[key] = 1;
>}
>}
>}
>
>Thanks,
>Anthony
>
>

IIRC

if(T* val = (key in association))
(*val)++;
else
association[key]=1;

haven't tried it but it should work



March 24, 2006
BCS wrote:
> In article <dvvk0i$2tum$1@digitaldaemon.com>, anthony.difranco@yale.edu says...
>> Can someone explain why I can't instantiate this template implicitly andor
>> comment on whether I'm overlooking a better way to accomplish what this template
>> does?
>>
>> template increment(T, K)
>> {
>> void increment(T[K] association, K key)
>> {
>> if(key in association)
>> {
>> association[key]++;
>> }
>> else
>> {
>> association[key] = 1;
>> }
>> }
>> }
>>
>> Thanks,
>> Anthony
>>
>>
> 
> IIRC
> 
> if(T* val = (key in association))
> (*val)++;
> else
> association[key]=1;
> 
> haven't tried it but it should work

Yes. A full working version with the current limited IFTI would look like:

template increment(T,K) {
	static assert(is(K : typeof(T.init.keys[0])));
	void increment(inout T association, K key) {
		if(auto val = (key in association))
			(*val)++;
		else
			association[key]=1;
	}
}


/Oskar
March 27, 2006
Thanks; it works.

In article <e00fq4$131r$1@digitaldaemon.com>, Oskar Linde says...
>
>BCS wrote:
>> In article <dvvk0i$2tum$1@digitaldaemon.com>, anthony.difranco@yale.edu says...
>>> Can someone explain why I can't instantiate this template implicitly andor comment on whether I'm overlooking a better way to accomplish what this template does?
>>>
>>> template increment(T, K)
>>> {
>>> void increment(T[K] association, K key)
>>> {
>>> if(key in association)
>>> {
>>> association[key]++;
>>> }
>>> else
>>> {
>>> association[key] = 1;
>>> }
>>> }
>>> }
>>>
>>> Thanks,
>>> Anthony
>>>
>>>
>> 
>> IIRC
>> 
>> if(T* val = (key in association))
>> (*val)++;
>> else
>> association[key]=1;
>> 
>> haven't tried it but it should work
>
>Yes. A full working version with the current limited IFTI would look like:
>
>template increment(T,K) {
>	static assert(is(K : typeof(T.init.keys[0])));
>	void increment(inout T association, K key) {
>		if(auto val = (key in association))
>			(*val)++;
>		else
>			association[key]=1;
>	}
>}
>
>
>/Oskar