共享一下自己n年前写的仿函数,希望对大家有用!
<
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提供的仿函数有什么区别了。
- 自己做的SQL语句生成器,希望大家有用
- 一个用java语言连接sql数据库例子,给自己做个备份,也希望能对大家有用。
- 自己写了一个Asp.net探针的源码,希望大家讨论一下
- 总结一下SHFileOperation的用法,希望对大家有用
- 自己写了一个Asp.net探针的源码,希望大家讨论一下
- 自己总结的一套JavaScript,希望对大家有用
- VC++文件操作之最全篇(总结一下希望对大家有用)
- db2入门常用语法(自己整理总结的希望对大家有用)
- 思维导图(自己整理,希望对大家有用):JavaScript函数+canvas绘图+Array数组
- tms320c31手记 一(主要是自己看用户手册的简要记录,希望拿出来大家能有用)
- 自己理解的java工厂模式,希望对大家有所帮助
- 最近项目中需要在指定的字符串中取出数字字符,找了好多但都是词不达意,索性自己写了个方法,与大家共享!
- 经常写VC工程的人都会遇到升级到VS2005时出现的各种各样的问题,下面写一些自己遇到的问题,还有什么不全的请大家补充。希望能给朋友们一些帮助。
- 基础性文章,希望对大家有用
- 关于C# socket多线程的7个问题.希望大家发表一下意见.
- 自己新做了一个小站 ,大家来测试一下看看
- ubuntu12.04安装opencv-1.0.0的问题(希望大家进来讨论一下) (转载增补)
- 简化自己的一个工程,共享给大家:Silverlight 做的Link Map
- 奋斗中。。。自己写的一个时钟程序,希望大家继续完善!
- 今天开通了自己的BLOG,希望以后有好文章给大家!