// specified for 0 argument template <typename R> class Closure<R> : public ClosureBase { public: virtual R Run() = 0; };
// specified for 1 argument template <typename R, typename Arg1> class Closure<R, Arg1> : public ClosureBase { public: virtual R Run(Arg1 arg1) = 0; }; // specified for 2 arguments template <typename R, typename Arg1, typename Arg2> class Closure<R, Arg1, Arg2> : public ClosureBase { public: virtual R Run(Arg1 arg1, Arg2 arg2) = 0; }; template < bool SelfDeleting, typename R, typename Class, typename MethodClass > class MethodClosure_Arg0_Bind0 : public Closure<R> { typedef R (MethodClass::*MethodType)(); public: MethodClosure_Arg0_Bind0(Class *object, MethodType method): m_object(object), m_method(method) {} virtual ~MethodClosure_Arg0_Bind0() { m_object = 0; m_method = 0; } virtual R Run() { ConditionalAutoDeleter<SelfDeleting, MethodClosure_Arg0_Bind0> self_deleter(this); return (m_object->*m_method)(); } virtual bool IsSelfDelete() const { return SelfDeleting; } private: Class* m_object; MethodType m_method; }; template < bool SelfDeleting, typename R, typename Arg1, typename Arg2, typename Arg3, typename PreArg1 > class FunctionClosure_Arg2_Bind1 : public Closure<R, Arg2, Arg3> { typedef R (*FunctionType)(Arg1, Arg2, Arg3); public: FunctionClosure_Arg2_Bind1(FunctionType function, PreArg1 pa1): m_function(function), m_pa1(pa1) {} virtual ~FunctionClosure_Arg2_Bind1() { m_function = 0; } virtual R Run(Arg2 arg2, Arg3 arg3) { ConditionalAutoDeleter<SelfDeleting, FunctionClosure_Arg2_Bind1> self_deleter(this); return m_function(m_pa1, arg2, arg3); } virtual bool IsSelfDelete() const { return SelfDeleting; } private: FunctionType m_function; PreArg1 m_pa1; };