回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般情况下, 我们使用的回调函数基本都是采用C语言风格. 这里介绍一种C++风格的回调对象方法. 采用template实现.
template < class Class, typename ReturnType, typename Parameter >
class SingularCallBack
{
public :
typedef ReturnType (Class:: * Method)(Parameter);
SingularCallBack(Class * _class_instance, Method _method)
{
// 取得对象实例地址,及调用方法地址
class_instance = _class_instance;
method = _method;
};
ReturnType operator ()(Parameter parameter)
{
// 调用对象方法
return (class_instance ->* method)(parameter);
};
ReturnType execute(Parameter parameter)
{
// 调用对象方法
return operator ()(parameter);
};
private :
Class * class_instance;
Method method;
};
示例:
以下是两个类实现.
class A
{
public :
void output()
{
std::cout << " I am class A :D " << std::endl;
};
};
class B
{
public :
bool methodB(A a)
{
a.output();
return true ;
}
};
A a;
B b;
SingularCallBack < B, bool ,A >* cb;
cb = new SingularCallBack < B, bool ,A > ( & b, & B::methodB);
if (( * cb)(a))
{
std::cout << " CallBack Fired Successfully! " << std::endl;
}
else
{
std::cout << " CallBack Fired Unsuccessfully! " << std::endl;
}
A a;
B b;
SingularCallBack < B, bool ,A >* cb;
cb = new SingularCallBack < B, bool ,A > ( & b, & B::methodB);
if (cb -> execute(a))
{
std::cout << " CallBack Fired Successfully! " << std::endl;
}
else
{
std::cout << " CallBack Fired Unsuccessfully! " << std::endl;
}
A a;
B b;
SingularCallBack < B, bool ,A > cb( & b, & B::methodB);
if (cb(a))
{
std::cout << " CallBack Fired Successfully! " << std::endl;
}
else
{
std::cout << " CallBack Fired Unsuccessfully! " << std::endl;
}
class AClass
{
public :
AClass(unsigned int _id): id(_id){};
~ AClass(){};
bool AMethod(std:: string str)
{
std::cout << " AClass[ " << id << " ]: " << str << std::endl;
return true ;
};
private :
unsigned int id;
};
typedef SingularCallBack < AClass, bool , std:: string > ACallBack;
int main()
{
std::vector < ACallBack > callback_list;
AClass a1( 1 );
AClass a2( 2 );
AClass a3( 3 );
callback_list.push_back(ACallBack( & a1, & AClass::AMethod));
callback_list.push_back(ACallBack( & a2, & AClass::AMethod));
callback_list.push_back(ACallBack( & a3, & AClass::AMethod));
for (unsigned int i = 0 ; i < callback_list.size(); i ++ )
{
callback_list[i]( " abc " );
}
for (unsigned int i = 0 ; i < callback_list.size(); i ++ )
{
callback_list[i].execute( " abc " );
}
return true ;
}
原文出处:http://blog.csdn.net/force_eagle/archive/2009/07/14/4347329.aspx