回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在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 |