Functors

Kirk McDonald kirklin.mcdonald at gmail.com
Thu Jun 28 12:48:46 PDT 2007


Craig Black wrote:
> I just realized that a Functor class is much much easier to express in D 
> than in C++.  Functors are more flexible than delegates because they can 
> be associated with static/global functions as well as functions local to 
> a class or struct.  In essense they can be either a function or a 
> delegate. The implementation is also pretty efficient.  The 
> implementation below does not support functions/delegates with return 
> values, but that would be easy to accommodate.  Anyway, thought it might 
> be useful to someone.
> 
> struct Functor(A...)
> {
> private:
> 
>  union
>  {
>    void function(A) fun;
>    void delegate(A) del;
>    int[2] words;
>  }
> 
> public:
> 
>  void clear()
>  {
>    words[0] = 0;
>    words[1] = 0;
>  }
> 
>  void opAssign(void function(A) arg)
>  {
>    fun = arg;
>    words[1] = 0;
>  }
> 
>  void opAssign(void delegate(A) arg)
>  {
>    del = arg;
>  }
> 
>  void invoke(A args)
>  {
>    if(words[0] == 0) return;
>    if(words[1] == 0) fun(args);
>    else del(args);
>  }
> }
> 
> int main(char[][] args)
> {
>  // A functor that takes no parameters
>  Functor!() functor;
> 
>  static void fun() { printf("In static function.\n"); }
>  functor = &fun;
>  functor.invoke;
> 
>  struct A { public void fun() { printf("In local function.\n"); } }
>  A a;
>  functor = &a.fun;
>  functor.invoke;
> 
>  return 0;
> }
> 

Instead of calling it "invoke", why not overload opCall?

-- 
Kirk McDonald
http://kirkmcdonald.blogspot.com
Pyd: Connecting D and Python
http://pyd.dsource.org



More information about the Digitalmars-d mailing list