www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Memoizing a templated function

reply "ixid" <nuaccount gmail.com> writes:
Memoizing a templated version of a function doesn't seem to work, 
how would I do it properly? For example:

int test(int n)
{
     return //Do memoizable stuff
}

T test2(T)(T n)
{
     return //Do memoizable stuff
}

void main()
{
     n = memoize!test(n); //is fine
     n = test2(n); //is fine
     n = memoize!test2(n); //gives errors
}


Error	1	Error: template instance ReturnType!(test) 
ReturnType!(test) does not match template declaration 
ReturnType(func...) if (func.length == 1 && 
isCallable!(func))	z:\Dlang\dmd2\src\phobos\std\functional.d	693	
Error	2	Error: ReturnType!(test) is used as a 
type	z:\Dlang\dmd2\src\phobos\std\functional.d	693	
Error	3	Error: template instance ParameterTypeTuple!(test) 
ParameterTypeTuple!(test) does not match template declaration 
ParameterTypeTuple(func...) if (func.length == 1 && 
isCallable!(func))	z:\Dlang\dmd2\src\phobos\std\functional.d	694	
Error	4	Error: ParameterTypeTuple!(test) is used as a 
type	z:\Dlang\dmd2\src\phobos\std\functional.d	693	
Error	5	Error: index is not a type or an 
expression	z:\Dlang\dmd2\src\phobos\std\functional.d	695	
Error	6	Error: template std.typecons.tuple does not match any 
function template 
declaration	z:\Dlang\dmd2\src\phobos\std\functional.d	696	
Error	7	Error: template std.typecons.tuple(T...) cannot deduce 
template function from argument types 
!()(_error_)	z:\Dlang\dmd2\src\phobos\std\typecons.d	687	
Error	8	Error: template main.test does not match any function 
template 
declaration	z:\Dlang\dmd2\src\phobos\std\functional.d	703	
Error	9	Error: template main.test(T) cannot deduce template 
function from argument types !()(_error_)	C:\Documents and 
Settings\Adam.LAPPY\My Documents\Visual Studio 
2008\Projects\d\test2\test2\main.d	5	
Error	10	Error: template instance std.functional.memoize!(test) 
error instantiating	C:\Documents and Settings\Adam.LAPPY\My 
Documents\Visual Studio 2008\Projects\d\test2\test2\main.d	12	
Error	11	Error: forward reference to memoize	C:\Documents and 
Settings\Adam.LAPPY\My Documents\Visual Studio 
2008\Projects\d\test2\test2\main.d	12	
Apr 16 2012
next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
ixid:

 Memoizing a templated version of a function doesn't seem to 
 work,

A template isn't a function, it's just a recipe to define a function given one or more compile-time values or types. So memoize works if you instantiate in some way the template: import std.functional; int test(int n) { return n * n; } T test2(T)(T n) { return n * n; } void main() { int n = 5; n = memoize!test(n); // OK n = test2(n); // OK n = memoize!(test2!int)(n); // OK n = memoize!(test2!(typeof(n)))(n); // OK } Bye, bearophile
Apr 16 2012
prev sibling parent Andrej Mitrovic <andrej.mitrovich gmail.com> writes:
On 4/17/12, ixid <nuaccount gmail.com> wrote:
 Memoizing a templated version of a function doesn't seem to work,
 how would I do it properly?

Instantiate the template first. Either: n = memoize!(test2!int)(n); or: alias test2!int itest; n = memoize!itest(n); Actually I'm a little surprised this doesn't work: memoize!(test2(1)); Seems like IFTI should come into play here but doesn't for some reason.. anyone else's thoughts?
Apr 16 2012