1 #ifndef ___HGL___FUNCTION_CALLBACK___
2 #define ___HGL___FUNCTION_CALLBACK___
4 #include "lib/uncopyable.h"
11 全てのコールバック関数クラスは、このクラスから派生する。
14 class FunctionCallback : private utility::UncopyableInterface {
17 virtual ~FunctionCallback() {}
20 virtual void Run() = 0;
29 それぞれ、FunctionCallback[返り値有無][Global/Member][引数の個数]
32 template<class T> class FunctionCallbackVoidGlobal0;
33 class FunctionCallbackVoid0;
34 template<class T> class FunctionCallbackVoidGlobal1;
35 template<class T1, class T2> class FunctionCallbackVoid2;
36 template<class T1, class T2, class T3> class FunctionCallbackVoid3;
37 template<class T1, class T2, class T3, class T4> class FunctionCallbackVoid4;
38 template<class T1, class T2, class T3, class T4, class T5>
39 class FunctionCallbackVoid5;
41 template<class Obj> class FunctionCallbackVoidMember0;
42 template<class Obj, class T> class FunctionCallbackVoidMember1;
43 template<class Obj, class T1, class T2> class FunctionCallbackVoidMember2;
44 template<class Obj, class T1, class T2, class T3>
45 class FunctionCallbackVoidMember3;
46 template<class Obj, class T1, class T2, class T3, class T4>
47 class FunctionCallbackVoidMember4;
48 template<class Obj, class T1, class T2, class T3, class T4, class T5>
49 class FunctionCallbackVoidMember5;
54 staticなcreate関数によって、それぞれを作成する。
55 また、これから作成されるクラスも、全てFunctionCallback派生クラスである。
57 class FunctionCallbackVoid : public FunctionCallback {
60 virtual ~FunctionCallbackVoid() {}
62 //----------------------------------------------------------------------
64 // ここでの関数群は、全て同じ名前のオーバーロードによって行われる。
65 //----------------------------------------------------------------------
67 // 引数無し、返り値無しの静的関数のみのコールバック関数クラス作成
69 static FunctionCallbackVoid* create(void (T::*f)()) {
70 return new FunctionCallbackVoidg0<T>(f);
75 static FunctionCallbackVoid* create(void (*f)(Arg1), Arg1 a1) {
76 return new FunctionCallbackVoid1<Arg1>(f, a1);
79 template<class Arg1, class Arg2>
80 static FunctionCallbackVoid* create(void (*f)(Arg1, Arg2),
82 return new FunctionCallbackVoid2<Arg1, Arg2>(f, a1, a2);
85 template<class Arg1, class Arg2, class Arg3>
86 static FunctionCallbackVoid* create(void (*f)(Arg1, Arg2, Arg3),
87 Arg1 a1, Arg2 a2, Arg3 a3) {
88 return new FunctionCallbackVoid3<Arg1, Arg2, Arg3>(f, a1, a2, a3);
91 template<class Arg1, class Arg2, class Arg3, class Arg4>
92 static FunctionCallbackVoid* create(void (*f)(Arg1, Arg2, Arg3, Arg4),
93 Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4) {
94 return new FunctionCallbackVoid4<Arg1, Arg2, Arg3, Arg4>
98 template<class Arg1, class Arg2, class Arg3, class Arg4, class Arg5>
99 static FunctionCallbackVoid*
100 create(void (*f)(Arg1, Arg2, Arg3, Arg4, Arg5), Arg1 a1, Arg2 a2,
101 Arg3 a3, Arg4 a4, Arg5 a5) {
102 return new FunctionCallbackVoid5<Arg1, Arg2, Arg3, Arg4, Arg5>
103 (f, a1, a2, a3, a4, a5);
108 static FunctionCallbackVoid* create(void (obj::*f)(), obj* p) {
109 return new FunctionCallbackVoidMember0<obj>(f, p);
112 template<class obj, class Arg1>
113 static FunctionCallbackVoid* create(void (obj::*f)(Arg1), obj* p,
115 return new FunctionCallbackVoidMember1<obj, Arg1>(f, p, a1);
118 template<class obj, class Arg1, class Arg2>
119 static FunctionCallbackVoid* create(void (obj::*f)(Arg1, Arg2), obj* p,
121 return new FunctionCallbackVoidMember2<obj, Arg1, Arg2>(f, p, a1, a2);
124 template<class obj, class Arg1, class Arg2, class Arg3>
125 static FunctionCallbackVoid* create(void (obj::*f)(Arg1, Arg2, Arg3),
126 obj* p, Arg1 a1, Arg2 a2, Arg3 a3) {
127 return new FunctionCallbackVoidMember3<obj, Arg1, Arg2, Arg3>
131 template<class obj, class Arg1, class Arg2, class Arg3, class Arg4>
132 static FunctionCallbackVoid*
133 create(void (obj::*f)(Arg1, Arg2, Arg3, Arg4), obj* p,
134 Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4) {
135 return new FunctionCallbackVoidMember4<obj, Arg1, Arg2, Arg3, Arg4>
136 (f, p, a1, a2, a3, a4);
139 template<class obj, class Arg1, class Arg2, class Arg3,
140 class Arg4, class Arg5>
141 static FunctionCallbackVoid*
142 create(void (obj::*f)(Arg1, Arg2, Arg3, Arg4, Arg5), obj* p,
143 Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5) {
144 return new FunctionCallbackVoidMember5<obj, Arg1, Arg2, Arg3, Arg4, Arg5>
145 (f, p, a1, a2, a3, a4, a5);
148 virtual void Run() {}
151 //==============================================================================
153 //==============================================================================
155 template<class Result, class T> class FunctionCallbackResultGlobal0;
157 template<class Result>class FunctionCallbackResult0;
159 template<class Result, class T> class FunctionCallbackResult1;
161 template<class Result, class T1, class T2> class FunctionCallbackResult2;
163 template<class Result, class T1, class T2, class T3> class FunctionCallbackResult3;
165 template<class Result, class T1, class T2, class T3, class T4>
166 class FunctionCallbackResult4;
168 template<class Result, class T1, class T2, class T3, class T4, class T5>
169 class FunctionCallbackResult5;
171 template<class Result, class OBJ> class FunctionCallbackResultMember0;
173 template<class Result, class OBJ, class T> class FunctionCallbackResultMember1;
175 template<class Result, class OBJ, class T1, class T2>
176 class FunctionCallbackResultMember2;
178 template<class Result, class OBJ, class T1, class T2, class T3>
179 class FunctionCallbackResultMember3;
181 template<class Result, class OBJ, class T1, class T2, class T3, class T4>
182 class FunctionCallbackResultMember4;
184 template<class Result, class OBJ, class T1, class T2,
185 class T3, class T4, class T5>
186 class FunctionCallbackResultMember5;
190 返り値ありのコールバック関数クラスの元締め
193 template<class Result>
194 class FunctionCallbackResult : public FunctionCallback {
197 FunctionCallbackResult() : mResultesult() {}
198 virtual ~FunctionCallbackResult() {}
200 //----------------------------------------------------------------------------
202 // 返り値はそれぞれ自由に設定することができる。
203 //----------------------------------------------------------------------------
204 inline FunctionCallbackResult<Result>* create(Result (*f)(void)) {
205 return new FunctionCallbackResult0<Result>(f);
210 static FunctionCallbackResult<Result>* create(Result (T::*f)()) {
211 return new FunctionCallbackResultGlobal0<Result, T>(f);
216 static FunctionCallbackResult<Result>* create(Result (*f)(Arg1), Arg1 a1) {
217 return new FunctionCallbackResult1<Result, Arg1>(f, a1);
220 template<class Arg1, class Arg2>
221 static FunctionCallbackResult<Result>* create(Result (*f)(Arg1, Arg2),
223 return new FunctionCallbackResult2<Result, Arg1, Arg2>(f, a1, a2);
226 template<class Arg1, class Arg2, class Arg3>
227 static FunctionCallbackResult<Result>*
228 create(Result (*f)(Arg1, Arg2, Arg3), Arg1 a1, Arg2 a2, Arg3 a3) {
229 return new FunctionCallbackResult3<Result, Arg1, Arg2, Arg3>(f, a1, a2, a3);
232 template<class Arg1, class Arg2, class Arg3, class Arg4>
233 static FunctionCallbackResult<Result>*
234 create(Result (*f)(Arg1, Arg2, Arg3, Arg4),
235 Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4) {
236 return new FunctionCallbackResult4<Result, Arg1, Arg2, Arg3, Arg4>
240 template<class Arg1, class Arg2, class Arg3, class Arg4, class Arg5>
241 static FunctionCallbackResult<Result>*
242 create(Result (*f)(Arg1, Arg2, Arg3, Arg4),
243 Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5) {
244 return new FunctionCallbackResult5<Result, Arg1, Arg2, Arg3, Arg4, Arg5>
245 (f, a1, a2, a3, a4, a5);
250 static FunctionCallbackResult<Result>* create(Result (T::*f)(), T* p) {
251 return new FunctionCallbackResultMember0<Result, T>(f, p);
254 template<class T, class Arg1>
255 static FunctionCallbackResult<Result>* create(Result (T::*f)(Arg1), T* p,
257 return new FunctionCallbackResultMember1<Result, T, Arg1>(f, p, a1);
260 template<class T, class Arg1, class Arg2>
261 static FunctionCallbackResult<Result>* create(Result (T::*f)(Arg1, Arg2), T* p,
263 return new FunctionCallbackResultMember2<Result, T, Arg1, Arg2>(f, p, a1, a2);
266 template<class T, class Arg1, class Arg2, class Arg3>
267 static FunctionCallbackResult<Result>* create(Result (T::*f)(Arg1, Arg2, Arg3),
268 T* p, Arg1 a1, Arg2 a2, Arg3 a3) {
269 return new FunctionCallbackResultMember3<Result, T, Arg1, Arg2, Arg3>
273 template<class T, class Arg1, class Arg2, class Arg3, class Arg4>
274 static FunctionCallbackResult<Result>*
275 create(Result (T::*f)(Arg1, Arg2, Arg3, Arg4), T* p,
276 Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4) {
277 return new FunctionCallbackResultMember4<Result, T, Arg1, Arg2, Arg3, Arg4>
278 (f, p, a1, a2, a3, a4);
281 template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5>
282 static FunctionCallbackResult<Result>*
283 create(Result (T::*f)(Arg1, Arg2, Arg3, Arg4, Arg5), T* p,
284 Arg1 a1, Arg2 a2, Arg3 a3, Arg4 a4, Arg5 a5) {
285 return new FunctionCallbackResultMember5<Result, T, Arg1, Arg2, Arg3, Arg4, Arg5>
286 (f, p, a1, a2, a3, a4, a5);
293 void SetResult(Result r) {this->result_ = r;}
300 //==============================================================================
302 // 各コールバックテンプレートは、原則として全てコピー不可能とする。
303 //==============================================================================
305 class FunctionCallbackVoid0 : public FunctionCallbackVoid {
307 typedef void (*CallBack)(void);
309 explicit FunctionCallbackVoid0(CallBack c) : function_(c) {}
322 class FunctionCallbackVoidGlobal0 : public FunctionCallbackVoid {
324 typedef void (T::*CallBack)();
326 FunctionCallbackVoidGlobal0(CallBack c) : function_(c) {}
327 FunctionCallbackVoidGlobal0(const FunctionCallbackVoidGlobal0& v) : function_(NULL) {
328 function_ = v.function_;
342 class FunctionCallbackVoid1 : public FunctionCallbackVoid {
344 typedef void (*CallBack)(Arg1);
346 FunctionCallbackVoid1(CallBack c,Arg1 a1) : function_(c),arg1_(a1) {}
347 FunctionCallbackVoid1(const FunctionCallbackVoid1<Arg1>& v) : function_(NULL),arg1_(NULL) {
348 function_ = v.function_;
363 template<class Arg1,class Arg2>
364 class FunctionCallbackVoid2 : public FunctionCallbackVoid {
366 typedef void (*CallBack)(Arg1,Arg2);
368 FunctionCallbackVoid2(CallBack c,Arg1 a1,Arg2 a2) :
369 function_(c),arg1_(a1),arg2_(a2) {}
370 FunctionCallbackVoid2(const FunctionCallbackVoid2<Arg1,Arg2>& v) :
371 function_(NULL),arg1_(NULL),arg2_(NULL) {
372 function_ = v.function_;
378 function_(arg1_,arg2_);
389 template<class Arg1,class Arg2,class Arg3>
390 class FunctionCallbackVoid3 : public FunctionCallbackVoid {
392 typedef void (*CallBack)(Arg1,Arg2,Arg3);
394 FunctionCallbackVoid3(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3) :
395 function_(c),arg1_(a1),arg2_(a2),arg3_(a3) {}
396 FunctionCallbackVoid3(const FunctionCallbackVoid3<Arg1,Arg2,Arg3>& v) :
397 function_(NULL),arg1_(NULL),arg2_(NULL),arg3_(NULL) {
398 function_ = v.function_;
405 function_(arg1_,arg2_,arg3_);
417 template<class Arg1,class Arg2,class Arg3,class Arg4>
418 class FunctionCallbackVoid4 : public FunctionCallbackVoid {
420 typedef void (*CallBack)(Arg1,Arg2,Arg3,Arg4);
422 FunctionCallbackVoid4(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
423 function_(c),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4) {}
424 FunctionCallbackVoid4(const FunctionCallbackVoid4
425 <Arg1,Arg2,Arg3,Arg4>& v) :
426 function_(NULL),arg1_(NULL),arg2_(NULL),arg3_(NULL),arg4_(NULL) {
427 function_ = v.function_;
435 function_(arg1_,arg2_,arg3_,arg4_);
448 template<class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
449 class FunctionCallbackVoid5 : public FunctionCallbackVoid {
451 typedef void (*CallBack)(Arg1,Arg2,Arg3,Arg4,Arg5);
453 FunctionCallbackVoid5(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
454 function_(c),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4),arg5_(a5) {}
455 FunctionCallbackVoid5(const FunctionCallbackVoid5<Arg1,Arg2,Arg3,
457 function_(NULL),arg1_(NULL),arg2_(NULL),arg3_(NULL),
458 arg4_(NULL), arg5_(NULL)
460 function_ = v.function_;
469 function_(arg1_,arg2_,arg3_,arg4_,arg5_);
483 //------------------------------------------------------------------
486 class FunctionCallbackVoidMember0 : public FunctionCallbackVoid {
488 typedef void (obj::*CallBack)();
490 FunctionCallbackVoidMember0(CallBack c,obj* p) : function_(c),obj_(p) {}
491 FunctionCallbackVoidMember0(const FunctionCallbackVoidMember0<obj>& o) : function_(NULL),obj_(NULL)
493 function_ = o.function_;
498 (obj_->*function_)();
508 template<class obj,class Arg1>
509 class FunctionCallbackVoidMember1 : public FunctionCallbackVoid {
511 typedef void (obj::*CallBack)(Arg1);
513 FunctionCallbackVoidMember1(CallBack c,obj* p,Arg1 a1) :
514 function_(c),obj_(p),arg1_(a1) {}
515 FunctionCallbackVoidMember1(const FunctionCallbackVoidMember1<obj,Arg1>& o) :
516 function_(NULL),obj_(NULL),arg1_(NULL)
518 function_ = o.function_;
524 (obj_->*function_)(arg1_);
535 template<class obj,class Arg1,class Arg2>
536 class FunctionCallbackVoidMember2 : public FunctionCallbackVoid {
538 typedef void (obj::*CallBack)(Arg1,Arg2);
540 FunctionCallbackVoidMember2(CallBack c,obj* p,Arg1 a1,Arg2 a2) :
541 function_(c),obj_(p),arg1_(a1),arg2_(a2) {}
542 FunctionCallbackVoidMember2(const FunctionCallbackVoidMember2<obj,Arg1,Arg2>& o) :
543 function_(NULL),obj_(NULL),arg1_(NULL),arg2_(NULL)
545 function_ = o.function_;
552 (obj_->*function_)(arg1_,arg2_);
564 template<class obj,class Arg1,class Arg2,class Arg3>
565 class FunctionCallbackVoidMember3 : public FunctionCallbackVoid {
567 typedef void (obj::*CallBack)(Arg1,Arg2,Arg3);
569 FunctionCallbackVoidMember3(CallBack c,obj* p,Arg1 a1,Arg2 a2,Arg3 a3) :
570 function_(c),obj_(p),arg1_(a1),arg2_(a2),arg3_(a3) {}
571 FunctionCallbackVoidMember3(const FunctionCallbackVoidMember3<obj,Arg1,Arg2,Arg3>& o) :
572 function_(NULL),obj_(NULL),arg1_(NULL),arg2_(NULL),arg3_(NULL)
574 function_ = o.function_;
582 (obj_->*function_)(arg1_,arg2_,arg3_);
595 template<class obj,class Arg1,class Arg2,class Arg3,class Arg4>
596 class FunctionCallbackVoidMember4 : public FunctionCallbackVoid {
598 typedef void (obj::*CallBack)(Arg1,Arg2,Arg3,Arg4);
600 FunctionCallbackVoidMember4(CallBack c,obj* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
601 function_(c),obj_(p),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4) {}
602 FunctionCallbackVoidMember4(const FunctionCallbackVoidMember4<obj,Arg1,Arg2,Arg3,Arg4>& o) :
603 function_(NULL),obj_(NULL),arg1_(NULL),arg2_(NULL),
604 arg3_(NULL),arg4_(NULL)
606 function_ = o.function_;
615 (obj_->*function_)(arg1_,arg2_,arg3_,arg4_);
629 template<class obj,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
630 class FunctionCallbackVoidMember5 : public FunctionCallbackVoid {
632 typedef void (obj::*CallBack)(Arg1,Arg2,Arg3,Arg4,Arg5);
634 FunctionCallbackVoidMember5(CallBack c,obj* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
635 function_(c),obj_(p),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4),arg5_(a5) {}
636 FunctionCallbackVoidMember5(const FunctionCallbackVoidMember5<obj,Arg1,Arg2,Arg3,Arg4,Arg5>& o) :
637 function_(NULL),obj_(NULL),arg1_(NULL),arg2_(NULL),
638 arg3_(NULL),arg4_(NULL),arg5_(NULL)
640 function_ = o.function_;
650 (obj_->*function_)(arg1_,arg2_,arg3_,arg4_,arg5_);
665 //-----------------------------------------------------------------------
667 template<class Result>
668 class FunctionCallbackResult0 : public FunctionCallbackResult<Result> {
670 typedef Result (*CallBack)();
672 FunctionCallbackResult0(CallBack c) : function_(c) {}
673 FunctionCallbackResult0(const FunctionCallbackResult0<Result>& r) :
676 function_ = r.function_;
680 Result r = function_();
690 template<class Result,class T>
691 class FunctionCallbackResultGlobal0 : public FunctionCallbackResult<Result> {
693 typedef Result (T::*CallBack)();
695 FunctionCallbackResultGlobal0(CallBack c) : function_(c) {}
696 FunctionCallbackResultGlobal0(const FunctionCallbackResultGlobal0<Result,T>& r) :
699 function_ = r.function_;
701 FunctionCallbackResult1<Result,T>& operator=(
702 const FunctionCallbackResult1<Result, T>& r)
704 function_ = r.function_;
708 Result r = function_();
718 template<class Result,class Arg1>
719 class FunctionCallbackResult1 : public FunctionCallbackResult<Result> {
721 typedef Result (*CallBack)(Arg1);
723 FunctionCallbackResult1(CallBack c,Arg1 a1) : function_(c),arg1_(a1) {}
724 FunctionCallbackResult1(const FunctionCallbackResult1<Result,Arg1>& r) :
725 function_(NULL), arg1_(NULL)
727 function_ = r.function_;
730 FunctionCallbackResult1<Result, Arg1>& operator=(
731 const FunctionCallbackResult1<Result,Arg1>& r)
733 function_ = r.function_;
738 Result r = function_(arg1_);
749 template<class Result,class Arg1,class Arg2>
750 class FunctionCallbackResult2 : public FunctionCallbackResult<Result> {
752 typedef Result (*CallBack)(Arg1,Arg2);
754 FunctionCallbackResult2(CallBack c,Arg1 a1,Arg2 a2) : function_(c),arg1_(a1),arg2_(a2) {}
755 FunctionCallbackResult2(const FunctionCallbackResult2<Result,Arg1,Arg2>& r) :
756 function_(NULL), arg1_(NULL), arg2_(NULL)
758 function_ = r.function_;
762 FunctionCallbackResult2<Result, Arg1, Arg2>& operator=(
763 const FunctionCallbackResult2<Result,Arg1,Arg2>& r)
765 function_ = r.function_;
771 Result r = function_(arg1_,arg2_);
783 template<class Result,class Arg1,class Arg2,class Arg3>
784 class FunctionCallbackResult3 : public FunctionCallbackResult<Result> {
786 typedef Result (*CallBack)(Arg1,Arg2,Arg3);
788 FunctionCallbackResult3(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3) :
789 function_(c),arg1_(a1),arg2_(a2),arg3_(a3) {}
790 FunctionCallbackResult3(const FunctionCallbackResult3<Result,Arg1,Arg2,Arg3>& r) :
791 function_(NULL), arg1_(NULL), arg2_(NULL), arg3_(NULL)
793 function_ = r.function_;
798 FunctionCallbackResult3<Result, Arg1, Arg2, Arg3>& operator=(
799 const FunctionCallbackResult3<Result,Arg1,Arg2, Arg3>& r)
801 function_ = r.function_;
808 Result r = function_(arg1_,arg2_,arg3_);
821 template<class Result,class Arg1,class Arg2,class Arg3,class Arg4>
822 class FunctionCallbackResult4 : public FunctionCallbackResult<Result> {
824 typedef Result (*CallBack)(Arg1,Arg2,Arg3,Arg4);
826 FunctionCallbackResult4(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
827 function_(c),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4) {}
828 FunctionCallbackResult4(const FunctionCallbackResult4<Result,Arg1,Arg2,Arg3,Arg4>& r) :
829 function_(NULL), arg1_(NULL), arg2_(NULL),arg3_(NULL), arg4_(NULL)
831 function_ = r.function_;
839 Result r = function_(arg1_,arg2_,arg3_,arg4_);
853 template<class Result,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
854 class FunctionCallbackResult5 : public FunctionCallbackResult<Result> {
856 typedef Result (*CallBack)(Arg1,Arg2,Arg3,Arg4);
858 FunctionCallbackResult5(CallBack c,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
859 function_(c),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4),arg5_(a5) {}
860 FunctionCallbackResult5(const FunctionCallbackResult5<Result,Arg1,Arg2,Arg3,Arg4,Arg5>& r) :
861 function_(NULL), arg1_(NULL), arg2_(NULL),arg3_(NULL), arg4_(NULL),
864 function_ = r.function_;
874 Result r = function_(arg1_,arg2_,arg3_,arg4_,arg5_);
889 template<class Result,class T>
890 class FunctionCallbackResultMember0 : public FunctionCallbackResult<Result> {
892 typedef Result (T::*CallBack)();
894 FunctionCallbackResultMember0(CallBack c,T* p) : function_(c),obj_(p) {}
895 FunctionCallbackResultMember0(const FunctionCallbackResultMember0<Result, T>& r) :
896 function_(NULL),obj_(NULL)
898 function_ = r.function_;
903 Result r = (obj_->*function_)();
914 template<class Result,class T,class Arg1>
915 class FunctionCallbackResultMember1 : public FunctionCallbackResult<Result> {
917 typedef Result (T::*CallBack)(Arg1);
919 FunctionCallbackResultMember1(CallBack c,T* p,Arg1 a1) :
920 function_(c),obj_(p),arg1_(a1) {}
921 FunctionCallbackResultMember1(const FunctionCallbackResultMember1<Result, T,Arg1>& r) :
922 function_(NULL),obj_(NULL), arg1_(NULL)
924 function_ = r.function_;
930 Result r = (obj_->*function_)(arg1_);
942 template<class Result,class T,class Arg1,class Arg2>
943 class FunctionCallbackResultMember2 : public FunctionCallbackResult<Result> {
945 typedef Result (T::*CallBack)(Arg1,Arg2);
947 FunctionCallbackResultMember2(CallBack c,T* p,Arg1 a1,Arg2 a2) :
948 function_(c),obj_(p),arg1_(a1),arg2_(a2) {}
949 FunctionCallbackResultMember2(const FunctionCallbackResultMember2<Result,T,Arg1,Arg2>& r) :
950 function_(NULL),obj_(NULL), arg1_(NULL), arg2_(NULL)
952 function_ = r.function_;
959 Result r = (obj_->*function_)(arg1_,arg2_);
972 template<class Result,class T,class Arg1,class Arg2,class Arg3>
973 class FunctionCallbackResultMember3 : public FunctionCallbackResult<Result> {
975 typedef Result (T::*CallBack)(Arg1,Arg2,Arg3);
977 FunctionCallbackResultMember3(CallBack c,T* p,Arg1 a1,Arg2 a2,Arg3 a3) :
978 function_(c),obj_(p),arg1_(a1),arg2_(a2),arg3_(a3) {}
979 FunctionCallbackResultMember3(const FunctionCallbackResultMember3<Result, T,
980 Arg1,Arg2,Arg3>& r) :
981 function_(NULL),obj_(NULL), arg1_(NULL), arg2_(NULL),
984 function_ = r.function_;
992 Result r = (obj_->*function_)(arg1_,arg2_,arg3_);
1006 template<class Result,class T,class Arg1,class Arg2,class Arg3,class Arg4>
1007 class FunctionCallbackResultMember4 : public FunctionCallbackResult<Result> {
1009 typedef Result (T::*CallBack)(Arg1,Arg2,Arg3,Arg4);
1011 FunctionCallbackResultMember4(CallBack c,T* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4) :
1012 function_(c),obj_(p),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4) {}
1013 FunctionCallbackResultMember4(const FunctionCallbackResultMember4<Result, T,
1014 Arg1,Arg2,Arg3,Arg4>& r) :
1015 function_(NULL),obj_(NULL), arg1_(NULL), arg2_(NULL),
1016 arg3_(NULL), arg4_(NULL)
1018 function_ = r.function_;
1026 virtual void Run() {
1027 Result r = (obj_->*function_)(arg1_,arg2_,arg3_,arg4_);
1042 template<class Result,class T,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5>
1043 class FunctionCallbackResultMember5 : public FunctionCallbackResult<Result> {
1045 typedef Result (T::*CallBack)(Arg1,Arg2,Arg3,Arg4,Arg5);
1047 FunctionCallbackResultMember5(CallBack c,T* p,Arg1 a1,Arg2 a2,Arg3 a3,Arg4 a4,Arg5 a5) :
1048 function_(c),obj_(p),arg1_(a1),arg2_(a2),arg3_(a3),arg4_(a4),arg5_(a5) {}
1049 FunctionCallbackResultMember5(const FunctionCallbackResultMember5<Result, T,
1050 Arg1,Arg2,Arg3,Arg4, Arg5>& r) :
1051 function_(NULL),obj_(NULL), arg1_(NULL), arg2_(NULL),
1052 arg3_(NULL), arg4_(NULL), arg5_(NULL)
1054 function_ = r.function_;
1063 virtual void Run() {
1064 Result r = (obj_->*function_)(arg1_,arg2_,arg3_,arg4_,arg5_);
1081 // この関数のみ、実体が必要であるため、ここで定義する。
1082 inline FunctionCallbackVoid* create(void (*f)(void))
1084 return new FunctionCallbackVoid0(f);