#include <iostream>
#include <typeinfo>
using namespace std;
void sar(){}
static void rar(){}
class Foo
{
public:
typedef void (Foo::*ACTION)(); // Foo空间内指向Foo成员的函数指针类型,可以指foo
typedef void (*AC2)(); // Foo空间内指向全局函数的指针类型,可以指sar
void foo()
{
cout << "foo is called" << endl;
}
static void bar(){}
};
//
// Command类,保存一个Foo对象和对象的一个方法,
// 执行过程就是通过对象调用方法,达到命令封装的效果。
//
class Command
{
public:
Command(Foo &f, Foo::ACTION act):f_(f), act_(act){}
void execute()
{
(f_.*act_)();
}
Foo &f_;
Foo::ACTION act_;
};
int main()
{
typedef void (*PF)();
Foo f;
Command c(f, &Foo::foo);
c.execute();
cout << typeid(&Foo::foo).name() << endl; // void (__thiscall Foo::*)(void)
cout << typeid(Foo::bar).name() << endl; // void __cdecl(void)
cout << typeid(sar).name() << endl; // void __cdecl(void)
cout << typeid(rar).name() << endl; // void __cdecl(void)
cout << typeid((Foo::AC2)NULL).name() << endl; // void (__cdecl*)(void),类型跟Foo没关系!
PF p = &Foo::foo; // error,类型不匹配
Foo::ACTION p = &Foo::foo; // ok
(*p)(); // error,不能调用
(f.*p)(); // ok
return 0;
}
// 可以把Command类做成模板
template<typename CLASS, typename METHORD>
class Command
{
public:
Command(CLASS &c, METHORD m):c_(c), m_(m){}
void execute()
{
(c_.*m_)();
}
CLASS &c_;
METHORD m_;
};
Command<Foo, Foo::ACTION> c(f, &Foo::foo);
这是神马狗B论坛。