C++中回调(CallBack)的使用方法
2009-07-14 23:15
417 查看
回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般情况下, 我们使用的回调函数基本都是采用C语言风格. 这里介绍一种C++风格的回调对象方法. 采用template实现.
view plaincopy to clipboardprint?
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;
};
示例:
以下是两个类实现.
view plaincopy to clipboardprint?
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;
}
};
SingularCallBack的各种调用示例:
view plaincopy to clipboardprint?
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;
}
view plaincopy to clipboardprint?
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;
}
view plaincopy to clipboardprint?
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;
}
view plaincopy to clipboardprint?
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;
}
引用:
C++ Callback Solution
view plaincopy to clipboardprint?
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;
};
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; };
示例:
以下是两个类实现.
view plaincopy to clipboardprint?
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;
}
};
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; } };
SingularCallBack的各种调用示例:
view plaincopy to clipboardprint?
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)(a)) { std::cout << "CallBack Fired Successfully!" << std::endl; } else { std::cout << "CallBack Fired Unsuccessfully!" << std::endl; }
view plaincopy to clipboardprint?
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; 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; }
view plaincopy to clipboardprint?
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;
}
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; }
view plaincopy to clipboardprint?
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;
}
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; }
引用:
C++ Callback Solution
相关文章推荐
- C++中回调(CallBack)的使用方法
- C++中回调(CallBack)的使用方法
- C++中回调(CallBack)的使用方法
- [ZZ]C++中回调(CallBack)的使用方法
- C++中回调(CallBack)的使用方法
- C++中回调(CallBack)的使用方法
- C++中回调(CallBack)的使用方法
- c++实现回调函数及使用方法
- JavaScript中预加载图片及callback回调方法的使用。
- 在Ext的JsonStore的load方法中使用回调callback(转)
- Android 接口函数回调(callback)的基础使用方法与理解【回调】的具体实现
- C#调用c++的dll 回调使用方法
- hibernate使用HibernateCallback 回调的方法查询SQL时could not execute query--作怪的别名
- C# 使用 MonoPInvokeCallback,让 C 直接回调 C# 函数(C/C++ 跨平台方案)
- c++ ios_base register_callback方法使用
- 使用 ICallbackEventHandler aspx页面中的DropDownList 的 SelectValue 出现中文导致不回调方法的问题
- C#调用c++的dll 回调使用方法
- C++的JSON库及使用方法
- android NDK开发——使用C\C++实现本地方法
- lua c++中的一种回调解决方法