www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Templated Function pointers

reply "js.mdnq" <js_adddot+mdng gmail.com> writes:
I need to store a templated function in a function pointer, how 
can I do this?


e.g.,

void function(double) myfuncptr;
void myfunc(double d) { }
myfuncptr = myfunc;

Now I would like to use a template parameter instead of double.

In C++ one can do this by using boosts binding's and function 
types.

For example, I want something like this

void function(F)(F) funcptr;

void Bind(T)(void function(T)(T) v)
{
     funcptr = v; // F is sort of deduced automatically as being 
T. Obviously problematic but effectively what I want to do.
}

This way I can bind to any function that takes a single type 
parameter and returns a void.


void function(F) myfuncptr;  // F is undefined
void myfunc(T)(T d) { }      //
myfuncptr = myfunc;

To do this using boost I would simply bind the parameter so 
myfuncptr would not depend on an arbitrary type.

I need a rather performant way to do this too.
Nov 29 2012
next sibling parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 11/29/2012 03:17 PM, js.mdnq wrote:
 I need to store a templated function in a function pointer, how can I do
 this?


 e.g.,

 void function(double) myfuncptr;
 void myfunc(double d) { }
 myfuncptr = myfunc;

 Now I would like to use a template parameter instead of double.

std.functional may have something: http://dlang.org/phobos/std_functional.html Are you looking for something like the following? import std.traits; auto myDelegate(F : T function(T), T)(F f) if (isFunctionPointer!F) // <-- probably unnecessary { return (T a) => f(a * 2); } double func_double(double d) { return d; } int func_int(int i) { return i; } void main() { auto d = myDelegate(&func_double); auto i = myDelegate(&func_int); assert(d(1.5) == 3.0); assert(i(42) == 84); } Ali
Nov 29 2012
prev sibling next sibling parent "js.mdnq" <js_adddot+mdng gmail.com> writes:
It seems one can accomplish this using delegates assigned by 
generic functions. The delegate will end hold holding the "state" 
of the function. It sort of acts like a binder. It seems to work 
but more testing needs to be done. I'm not sure how efficient it 
is or if there is a better way but basically it seems rather 
elegant(rather than trying to create some new type to deal with 
it).
Nov 30 2012
prev sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
js.mdnq:

 It seems one can accomplish this using delegates assigned by 
 generic functions.

If you care so much for performance, when you work with D delegates it's useful to know the difference between static/scope delegates (that are just a fat pointer) and closures (that often induce a heap allocation). Bye, bearophile
Nov 30 2012