软件架构设计之Utility模块――Functor(三)

2014-11-24 07:13:35 · 作者: · 浏览: 3
pe ResultType;
typedef typename Base::Parm1 Parm1;
typedef typename Base::Parm1 Parm2;
HTMemFunHandler(const Fun& fun) : m_fun(fun) {}
HTMemFunHandler* Clone() const { return new HTMemFunHandler(*this); }
ResultType operator()(ObjClass* pObj)
{ return (pObj->*m_fun)(); }
ResultType operator()(Parm1 p1, ObjClass* pObj)
{ return (pObj->*m_fun)(p1); }
ResultType operator()(Parm1 p1, Parm2 p2, ObjClass* pObj)
{ return (pObj->*m_fun)(p1, p2); }
private:
Fun m_fun;
};
// HTFunctor实现体
template
class HTFunctor
{
typedef HTFunctorImpl Impl;
public:
typedef R ResultType;
typedef TList ParmList;
typedef typename Impl::Parm1 Parm1;
typedef typename Impl::Parm2 Parm2;
HTFunctor() : m_spImpl() {}
HTFunctor(const HTFunctor& rhs) : m_spImpl(rhs.m_spImpl->Clone()) {}
explicit HTFunctor(std::auto_ptr
spImpl) : m_spImpl(spImpl) {}
HTFunctor& operator=(const HTFunctor& rhs)
{
HTFunctor copy(rhs);
Impl* p = m_spImpl.release();
m_spImpl.reset(copy.m_spImpl.release());
copy.m_spImpl.reset(p);
return *this;
}
template
HTFunctor(Fun fun)
: m_spImpl(new
HTSelect<
HTIsSameType::value,
HTFunctorHandler,
HTMemFunHandler >::Result(fun))
{}
ResultType operator()(ObjClass* pObj = HT_NULL) {
return (*m_spImpl)(pObj);
}
ResultType operator()(Parm1 p1, ObjClass* pObj = HT_NULL) {
return (*m_spImpl)(p1, pObj);
}
ResultType operator()(Parm1 p1, Parm2 p2, ObjClass* pObj = HT_NULL) {
return (*m_spImpl)(p1, p2, pObj);
}
private:
std::auto_ptr m_spImpl;
};