From FunctorObject:
Here's a stripped down version of a C++ implementation: -- PhilGoodwin
This declares an interface for functors that is used by clients. Other versions of this interface include parameter types and return values
struct Functor { virtual void operator()()=0; };This declares an adaptor that turns an object/method pair into a Functor that can be passed to a client
template< typename Type_ > class FunctorFor: public Functor { public: typedef void(Type_::*MemberFunction)(); private: Type_ *theInstance; MemberFunction theMethod; public: FunctorFor(Type_ *anInstance, MemberFunction aMethod): theInstance(anInstance), theMethod(aMethod){} void operator()() { (theInstance->*theMethod)(); } };This declares an adaptor for normal function pointers It doesn't actually do anything except add type safety
class FunctionFunctor: public Functor { public: typedef void(*FunctionType)(); private: Function theFunction; public: FunctionFunctor(FunctionType aFunction): theFunction(aFunction){} void operator() () { theFunction(); } };Here are a couple of snippets that show how to add parameter and return types:
template< typename ReturnType, typename ParameterType > struct FunctorR1 { ReturnType operator() (ParameterType)=0; }; template< typename Type_, typename ReturnType, typename ParameterType > class FunctorR1For: class FunctorR1<ReturnType, ParameterType> { ... typedef ReturnType(Type_::*MemberFunction)(ParameterType); ... ReturnType operator() (ParameterType param) { return (theInstance->*theMethod(param); } };
See BlocksInJava for an example in the JavaLanguage