#轉載段小程序
#include <iostream>
#include <utility>
using namespace std;
template <typename ObjectType,
typename ReturnType,
typename MemFuncPtrType>
class PMFC {
public:
typedef std::pair<ObjectType*, MemFuncPtrType> CallInfo;
PMFC(const CallInfo& info) : callInfo(info) {}
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 *initVal) : ptr(initVal) {}
// no parameter
template <typename ReturnType>
const PMFC<T, ReturnType, ReturnType (T::*)()>
operator->*(ReturnType (T::*pmf)()) const {
return std::make_pair(ptr, pmf);
}
// one paramter
template <typename ReturnType, typename Param1Type>
const PMFC<T, ReturnType, ReturnType (T::*)(Param1Type)>
operator->*(ReturnType (T::*pmf)(Param1Type)) const {
return make_pair(ptr, pmf);
}
protected:
T *ptr;
};
template <typename T>
class SP : private SmartPtrBase<T> {
public:
SP(T *p) : SmartPtrBase<T>(p) {}
using SmartPtrBase<T>:: operator->*;
};
class Wombat {
public:
int dig() {
cout << "Digging..." << endl;
return 1;
}
int dig(int i) {
cout << "Digging " << i << " metres..." << endl;
}
int sleep() {
cout << "Sleeping..." << endl;
}
int sleep(int s) {
cout << "Sleeping " << s << " minutes..." << endl;
}
};
int main()
{
typedef int (Wombat::*PWMF)();
typedef int (Wombat::*PWMF1)(int);
SP<Wombat> pw = new Wombat;
PWMF pmf = &Wombat::dig;
(pw->*pmf)();
PWMF1 pmf1 = &Wombat::dig;
(pw->*pmf1)(5);
pmf = &Wombat::sleep;
(pw->*pmf)();
pmf1 = &Wombat::sleep;
(pw->*pmf1)(30);
}
//Implementing operator->* for Smart Pointers
//(Dr. Dobb's Journal October 1999/10)
//作者:Scott Meyers