a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 102|回复: 0

[C++] C++中回调函数CallBack的使用方法

[复制链接]
发表于 2012-7-31 21:56:58 | 显示全部楼层 |阅读模式
回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般情况下, 我们使用的回调函数基本都是采用C语言风格. 这里介绍一种C++风格的回调对象方法. 采用template实现.
* P0 B: \- C6 Z7 M1 d  template < class Class, typename ReturnType, typename Parameter >
" _6 q" g6 @1 U$ G9 Y" C  class SingularCallBack( k; V. W, }6 Y; J
  {
0 d; ?% U% U' J1 n- c  public:! s. z2 J5 M9 ?5 @' }
  typedef ReturnType (Class::*Method)(Parameter);
* _8 R( f$ E& W9 k  p  SingularCallBack(Class* _class_instance, Method _method)" Z* Z- _2 l) g2 f; S3 [
  {' }7 V. P/ x& W- F. j1 h" o5 u- U7 b
  //取得对象实例地址,及调用方法地址( U! P9 W6 t. g% a0 p/ c
  class_instance = _class_instance;
4 k$ O3 N7 D4 D$ w- e) a" N  method        = _method;7 L4 ~% h# g5 E: r9 n3 \; E
  };
/ s2 E' k, ~9 g* c  ReturnType operator()(Parameter parameter)
% Q, l8 ^! U* Y3 ~6 W* {7 G  {
+ e' m$ v$ A- C- E3 w; j( w  // 调用对象方法
0 y- c' n, ~7 }, v  return (class_instance->*method)(parameter);
* m$ ], ?/ S2 c1 K& ^/ B  };
* ^. D$ x1 ]% j7 R" j/ k  ReturnType execute(Parameter parameter)+ `+ m+ f. S& D0 X# {% O
  {
  B! {0 U" n7 G5 D  V  // 调用对象方法
! z) u0 _* T8 t, g# X  return operator()(parameter);& J5 C" o9 c1 E* T5 X9 l8 \
  };; }1 J0 B4 F0 N' N( _+ E% [
  private:, o/ K; R. ^9 }3 m" }
  Class*  class_instance;
% T" |  i( Y+ X9 h+ v  L. G  Method  method;- f( ^- m6 B0 B* }% q; s* ]
  };
% H  x2 O: [0 O4 {* `  {  示例:& B1 q* V6 d1 R" K1 [- v4 V, ?$ a
  以下是两个类实现.& \8 d$ q  `! q6 s& j
  class A
( I/ t. d9 L" v, h& s6 n+ Z  {
3 e) H, Z- ]  q" P9 L* x$ ^  public:
+ ~! T! F/ d2 u! s5 l8 W  void output()
$ l# Y' }: J( ?  {
+ D. V3 A, D5 L  std::cout (&b,&B::methodB);/ \5 g8 ^7 z, {* H3 ?
  if((*cb)(a)): b" Y* z. j) F4 r* \6 W- W
  {0 [3 a- Z$ K, [5 O9 G; Z1 B
  std::cout
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 16:13 , Processed in 0.142791 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表