Thread overview | ||||||
---|---|---|---|---|---|---|
|
November 29, 2012 Templated Function pointers | ||||
---|---|---|---|---|
| ||||
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. |
November 30, 2012 Re: Templated Function pointers | ||||
---|---|---|---|---|
| ||||
Posted in reply to js.mdnq | 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 |
November 30, 2012 Re: Templated Function pointers | ||||
---|---|---|---|---|
| ||||
Posted in reply to js.mdnq | 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). |
November 30, 2012 Re: Templated Function pointers | ||||
---|---|---|---|---|
| ||||
Posted in reply to js.mdnq | 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
|
Copyright © 1999-2021 by the D Language Foundation