Scott Meyes 代码简单剖析

发表于:2007-07-01来源:作者:点击数: 标签:
Scott Meyes 是世界顶尖C++大师,著作有《Effective C++》,《More Effective C++》等,并发表许多著名评论和文章。 关键字:traits, partial specialization, 指向成员函数的指针, operator-* DarkSpy 2002/4/24 /*NOTE 请使用g++ 2.97 or higher, Intel C++
Scott Meyes 是世界顶尖C++大师,著作有《Effective C++》,《More Effective C++》等,并发表许多著名评论和文章。

关键字:traits, partial specialization, 指向成员函数的指针, operator->*

DarkSpy 2002/4/24

/*NOTE
请使用g++ 2.97 or higher,
Intel C++ 5.0 or higher (6.0 beta for DarkSpy only [DarkSpy report bug])
编译,其他主流编译器无法正确通过, VC 居然出现 26 处错误 */

#include
#include // 包含 pair 和 make_pair
using namespace std;

template
struct MemFuncTraits { };

//partial specialization 1
template
struct MemFuncTraits {
typedef R ReturnType;
typedef O ObjectType;
};

//partial specialization 2
template
struct MemFuncTraits {
typedef R ReturnType;
typedef O ObjectType;
};

//partial specialization 3
template
struct MemFuncTraits {
typedef R ReturnType;
typedef O ObjectType;
};

//partial specialization 4
template
struct MemFuncTraits {
typedef R ReturnType;
typedef O ObjectType;
};

template
class PMFC {
public:
typedef typename MemFuncTraits ::ObjectType ObjectType;
typedef typename MemFuncTraits ::ReturnType ReturnType;
typedef std::pair CallInfo;
PMFC(const CallInfo& info) : _callinfo(info) { } //init

// 支持无参数类型,ReturnType = MemFuncPreType
ReturnType operator()() const
{ return (_callinfo.first->*_callinfo.second)(); }

// 支持具有参数类型
template
ReturnType operator()(Param1Type p1) const
{ return (_callinfo.first->*_callinfo.second)(p1); }
private:
CallInfo _callinfo;
};

template
class SmartPtrBase {
public:
SmartPtrBase(T *p) : ptr(p) { } //init

//partial specialization PMFC 并 重载 operator->*.
template
const PMFC operator->*(MemFuncPtrType pmf) const
{ return std::make_pair(ptr, pmf); }
private:
T* ptr;
};

template
class SP : private SmartPtrBase {
// g++ 3.0.2 都有错误,改为 public,估计是一个 bug。Intel C++没有错误。
public:
SP(T *p) : SmartPtrBase (p) { }
using SmartPtrBase ::operator->*;
//强制将 private 继承的 operator->* 继承为 public 为 main 中调用。
};

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)(); //for Wombat::dig(0, sleep()
typedef int (Wombat::*PWMFC)() const; //for Wombat::eat() const
typedef int (Wombat::*PWMF1)(int); //for Wombat::move()

main()
{
SP 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;
}

如果有不同意见或者有任何疑问可以和DarkSpy联系: coneos@263.net

原文转自:http://www.ltesting.net