template
<
class R  = void,
class T1 = void,
class T2 = void,
class T3 = void,
class T4 = void,
class T5 = void

class Functor;

 

#define NEW_FUNCTOR(TFunctor,T,pT,mfun) TFunctor::New<T,mfun>(pT)
#define NEW_FUNCTOR_CONST(TFunctor,T,pT,mfun) TFunctor::NewConst<T,mfun>(pT)

 

template<class R>
class Functor<R,void,void,void,void,void>
{
public:
typedef R R;
typedef Functor<R,void,void,void,void,void> MyFunctor;
typedef R (Functor::*MemFun)();

private:
MemFun mpMF;
void* mp;

public:
R NullFun()
{
Warning("NullFun");
}

Functor(MemFun pMF = &MyFunctor::NullFun , void* pT = 0)
:mpMF(pMF)
,mp(pT)
{
}

template<class T, R (T::*MemFun)()>
inline static MyFunctor New(T* pT)
{
return MyFunctor(&MemFunctorImpl<T,MemFun>,pT);
}

template<class T, R (T::*MemFun)() const>
inline static MyFunctor NewConst(T* pT)
{
return MyFunctor(&MemFunctorConstImpl<T,MemFun>,pT);
}

template<R (*Fun)()>
R FunctorImpl()
{
return Fun();
}

template<class T,  R (T::*MemFun)()>
R MemFunctorImpl()
{
T* pT = (T*)mp;
return ((*pT).*MemFun)();
}

template<class T,  R (T::*MemFun)() const>
R MemFunctorConstImpl()
{
T* pT = (T*)mp;
return ((*pT).*MemFun)();
}

//
R operator()()
{
return ((*this).*mpMF)();
}

    bool operator==(const MyFunctor& rhs) const
    { return (this->mpMF == rhs.mpMF && this->mp == rhs.mp); }

operator bool() const
{ return mpMF != &MyFunctor::NullFun; }

};


template<class R,class T1>
class Functor<R,T1,void,void,void,void>
{
public:
typedef R R;
typedef T1 T1;

typedef Functor<R,T1,void,void,void,void> MyFunctor;
typedef R (Functor::*MemFun)(T1);

private:
MemFun mpMF;
void* mp;

public:
R NullFun(T1)
{
Warning("NullFun");
}

Functor(MemFun pMF = &MyFunctor::NullFun , void* pT = 0)
:mpMF(pMF)
,mp(pT)
{
}

template<class T, R (T::*MemFun)(T1)>
inline static MyFunctor New(T* pT)
{
return MyFunctor(&MemFunctorImpl<T,MemFun>,pT);
}

template<class T, R (T::*MemFun)(T1)const>
inline static MyFunctor NewConst(T* pT)
{
return MyFunctor(&MemFunctorConstImpl<T,MemFun>,pT);
}

template<R (*Fun)(T1)>
R FunctorImpl(T1 t1)
{
return Fun(t1);
}

template<class T,  R (T::*MemFun)(T1)>
R MemFunctorImpl(T1 t1)
{
T* pT = (T*)mp;
return ((*pT).*MemFun)(t1);
}

template<class T,  R (T::*MemFun)(T1)const>
R MemFunctorConstImpl(T1 t1)
{
T* pT = (T*)mp;
return ((*pT).*MemFun)(t1);
}

R operator()(T1 t1)
{
return ((*this).*mpMF)(t1);
}

    bool operator==(const MyFunctor& rhs) const
    { return (this->mpMF == rhs.mpMF && this->mp == rhs.mp); }

operator bool() const
{ return mpMF != &MyFunctor::NullFun; }

};

... ...

///////////////////////////////////////////////////////////////////////////////////////
//main.cpp
#include <iostream>

class C
{
public:
void fun(int)
{
std::cout << "call C::fun(int)";
}
};

typedef Functor<void,int> CFun;

void main()
{
C c;

CFun f = CFun::New<C,&C::fun>(&c);

f(0); //call C::fun(int)

}


用起来很简单,我也不多说了。
如果大家原来对仿函数就有研究的,就可以看出这和其他lib提供的仿函数有什么区别了。