黑基网 首页 服务器 Linux 查看内容

Scott Meyes 代码简单剖析完全修正版 2.0

2005-6-13 12:49| 投稿: Linux

摘要: /*NOTE 请使用g++ 2.95 or higher, Intel C++ 5.0 or higher ...
/*NOTE 请使用g++ 2.95 or higher, Intel C++ 5.0 or higher (6.0 has been released) 编译,其他主流编译器无法正确通过, VC 居然出现 26 处错误 */ #include < iostream > #include < utility > // 含 pair 和 make_pairusing namespace std; template <typename T> struct MemFuncTraits { }; //partial specialization 1 template < typename R, typename O > struct MemFuncTraits< R (O::*)() /* 指向成员函数指针 */ > { typedef R ReturnType; typedef O ObjectType; }; //partial specialization 2 template < typename R, typename O > struct MemFuncTraits< R (O::*)() const /* 指向成员函数 const 的指针 */ > { typedef R ReturnType; typedef O ObjectType; }; //partial specialization 3 template < typename R, typename O, typename P1 > struct MemFuncTraits< R (O::*)(P1) /* 指向具有参数类型的成员函数指针 */ > { typedef R ReturnType; typedef O ObjectType; }; //partial specialization 4 template < typename R, typename O, typename P1 > struct MemFuncTraits< R (O::*)(P1) const /* 指向具有参数类型的 const 成员函数指针 */ > { typedef R ReturnType; typedef O ObjectType; }; template < typename MemFuncPtrType > class PMFC { public: typedef typename MemFuncTraits<MemFuncPtrType>::ObjectType ObjectType; typedef typename MemFuncTraits<MemFuncPtrType>::ReturnType ReturnType; typedef std::pair<ObjectType*, MemFuncPtrType> CallInfo; PMFC(const CallInfo& info) : _callinfo(info) { } //init // 支持无参数类型,ReturnType = MemFuncPreType ReturnType operator()() const { return (_callinfo.first->*_callinfo.second)(); } // 支持具有参数类型 template <typename Param1Type> ReturnType operator()(Param1Type p1) const { return (_callinfo.first->*_callinfo.second)(p1); } private: CallInfo _callinfo; }; template <typename T> class SmartPtrBase { public: SmartPtrBase(T *p) : ptr(p) { } //init //partial specialization PMFC 并 重载 operator->*. template <typename MemFuncPtrType> const PMFC<MemFuncPtrType> operator->*(MemFuncPtrType pmf) const { return std::make_pair(ptr, pmf); } private: T* ptr; }; template <typename T> class SP : private SmartPtrBase<T> { // g++ 3.04 都有错误,改为 public,估计是一个 bug。Intel C++没有错误。public: SP(T *p) : SmartPtrBase<T>(p) { } using SmartPtrBase<T>::operator->*; }; class Wombat { public: int dig() { cout << "Digging..." << endl; return 1; } int sleep() { cout << "Sleeping..." << endl; return 5; } int eat() const { cout << "Eatting..." << endl; return 7; } int move(int op) { cout << "Moving..." << endl; return 9; } }; typedef int (Wombat::*PWMF)(); typedef int (Wombat::*PWMFC)() const; typedef int (Wombat::*PWMF1)(int); main() { SP<Wombat> pw = new Wombat; PWMF pmf = &Wombat::dig; (pw->*pmf)(); // Digging... pmf = &Wombat::sleep; (pw->*pmf)(); // Sleeping... PWMFC pmfc = &Wombat::eat; (pw->*pmfc)(); // Eatting... PWMF1 pmf1 = &Wombat::move; (pw->*pmf1)(2); // Eatting... return 0; }
小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论


新出炉

返回顶部