Accepting function or delegate as function argument

Gary Willoughby via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 6 12:34:17 PDT 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:
>> 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 ?
>
> http://dlang.org/phobos/std_functional.html#.toDelegate
>
> 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.

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"));
}


More information about the Digitalmars-d-learn mailing list