digitalmars.D.learn - Accepting function or delegate as function argument
- chmike (22/22) May 04 2016 I have implemented the following class (simplified ;) )
- Adam D. Ruppe (5/9) May 04 2016 Do the overload and convert function to delegate with
- Rene Zwanenburg (5/9) May 04 2016 http://dlang.org/phobos/std_functional.html#.toDelegate
- Gary Willoughby (25/35) May 06 2016 import std.functional;
I have implemented the following class (simplified ;) )
----
class Foo(K,T) {
this(T delegate (K) factory) { m_factory = factory; }
T delegate (K) m_factory;
T bar(K key) { return m_factory(key); }
}
string dummyFactory(string key) { return "Hello "~key; }
void main()
{
auto foo = new Foo!(string,string)(&dummyFactory);
writeln(foo.bar("world"));
}
----
The compiler complains that dummyFactory is a pointer to a
function and not a delegate.
How can I modify the class definition so that it accepts a
function or a delegate transparently from the user perspective ?
Two constructors, one accepting a function and the other one
accepting a delegate would do the job for the API. Is there a
simple method to convert a function pointer into a delegate
pointer that is also efficient ?
May 04 2016
On Wednesday, 4 May 2016 at 14:54:39 UTC, chmike wrote:Two constructors, one accepting a function and the other one accepting a delegate would do the job for the API. Is there a simple method to convert a function pointer into a delegate pointer that is also efficient ?Do the overload and convert function to delegate with std.functional.toDelegate http://dpldocs.info/experimental-docs/std.functional.toDelegate.html stored_dg = toDelegate(passed_function);
May 04 2016
On Wednesday, 4 May 2016 at 14:54:39 UTC, chmike wrote:Two constructors, one accepting a function and the other one accepting a delegate would do the job for the API. Is there a simple method to convert a function pointer into a delegate pointer that is also efficient ?You can also make your constructor a template, constrain it on isCallable if you wish, and then use toDelegate. If the argument is already a delegate toDelegate will avoid doing extra work.
May 04 2016
On Wednesday, 4 May 2016 at 15:23:20 UTC, Rene Zwanenburg wrote:On Wednesday, 4 May 2016 at 14:54:39 UTC, chmike wrote:import std.functional; import std.stdio; import std.traits; class Foo(K,T) { private T delegate(K) m_factory; public this(T)(T factory) if (isCallable!(T)) { this.m_factory = toDelegate(factory); } public T bar(K key) { return this.m_factory(key); } } string dummyFactory(string key) { return "Hello " ~ key; } void main() { auto foo = new Foo!(string, string)(&dummyFactory); writeln(foo.bar("world")); }Two constructors, one accepting a function and the other one accepting a delegate would do the job for the API. Is there a simple method to convert a function pointer into a delegate pointer that is also efficient ?You can also make your constructor a template, constrain it on isCallable if you wish, and then use toDelegate. If the argument is already a delegate toDelegate will avoid doing extra work.
May 06 2016









Adam D. Ruppe <destructionator gmail.com> 