庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>编程开发>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

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

 作者:本站收集   日期:2005-4-14
字号选择〖 〗/ 双击滚屏 单击停止   
/*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;
}
上一篇:Linux中IP 隧道的分析与建议    下一篇:Scott Meyes 代码简单剖析  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-4-14
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿