| struct StrLen_Delegate { typedef size_t (Str::*MF_T)(const char*); MF_T m_method; Object& m_pTarget; StrLen_Delegate(Object& o, const MF_T& mf) : m_pTarget(&o), m_method(mf) {} MF_T Method() const { return m_method; } Object& Target() const { return *m_pTarget; } size_t Invoke(const char* s) { (m_pTarget.*m_method)(s); } }; void printSize2(const char* s) { Str str; StrLen_Delegate d(str, &Str::Len); (void) printf("%s is %ld chars\n", s, d.Invoke(s)); } |
| template <typename ARG1> struct StrLen_Delegate { typedef size_t (Str::*MF_T)(ARG1); // ... as above ... size_t Invoke(ARG1 v1) { (m_pTarget.*m_method)(v1); } }; |
| struct Object { template <typename ARG1> struct void1_T { typedef void (Object::*mf_t)(ARG1); }; template <typename ARG1, typename ARG2> void Invoke(void1_T<ARG1>::mf_t mf, ARG1 v1, ARG2) const { (this->*mf)(v1); } }; template <typename CLASS> class ObjectT : public Object {}; typedef ObjectT<void> VoidType; |
| template <typename MF_T> class DelegateT_ : public ObjectT<MF_T> { MF_T m_method; Object* m_pTarget; protected: DelegateT_() : m_pTarget(NULL), m_method(NULL) {} DelegateT_(Object& o, const MF_T& mf) : m_pTarget(&o), m_method(mf) {} public: MF_T Method() const { return m_method; } Object& Target() const { return *m_pTarget; } }; |
关注此文的读者还看过: