1 /*=============================================================================
3 Copyright (c) 2001-2002 Joel de Guzman
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 #ifndef PHOENIX_BINDERS_HPP
9 #define PHOENIX_BINDERS_HPP
11 ///////////////////////////////////////////////////////////////////////////////
12 #include <boost/spirit/home/classic/phoenix/functions.hpp>
13 #include <boost/type_traits/is_const.hpp>
14 #include <boost/mpl/if.hpp>
16 ///////////////////////////////////////////////////////////////////////////////
19 ///////////////////////////////////////////////////////////////////////////////
23 // There are times when it is desireable to bind a simple functor,
24 // function, member function or member variable for deferred
25 // evaluation. This can be done through the binding facilities
26 // provided below. There are template classes:
28 // 1) function_ptr ( function pointer binder )
29 // 2) functor ( functor pointer binder )
30 // 3) member_function_ptr ( member function pointer binder )
31 // 4) member_var_ptr ( member variable pointer binder )
33 // These template classes are specialized lazy function classes for
34 // functors, function pointers, member function pointers and member
35 // variable pointers, respectively. These are subclasses of the
36 // lazy-function class (see functions.hpp). Each of these has a
37 // corresponding overloaded bind(x) function. Each bind(x) function
38 // generates a suitable binder object.
40 // Example, given a function foo:
42 // void foo_(int n) { std::cout << n << std::endl; }
44 // Here's how the function foo is bound:
48 // This bind expression results to a lazy-function (see
49 // functions.hpp) that is lazily evaluated. This bind expression is
50 // also equivalent to:
52 // function_ptr<void, int> foo = &foo_;
54 // The template parameter of the function_ptr is the return and
55 // argument types of actual signature of the function to be bound
56 // read from left to right:
58 // void foo_(int); ---> function_ptr<void, int>
60 // Either bind(&foo_) and its equivalent foo can now be used in the
61 // same way a lazy function (see functions.hpp) is used:
69 // The latter, of course, being much easier to understand. This is
70 // now a full-fledged lazy function that can finally be evaluated
71 // by another function call invocation. A second function call will
72 // invoke the actual foo function:
77 // will print out "4".
79 // Binding functors and member functions can be done similarly.
80 // Here's how to bind a functor (e.g. std::plus<int>):
82 // bind(std::plus<int>())
86 // functor<std::plus<int> > plus;
88 // Again, these are full-fledged lazy functions. In this case,
89 // unlike the first example, expect 2 arguments (std::plus<int>
90 // needs two arguments lhs and rhs). Either or both of which can be
93 // plus(arg1, arg2) // arg1 + arg2
94 // plus(100, arg1) // 100 + arg1
95 // plus(100, 200) // 300
97 // A bound member function takes in a pointer or reference to an
98 // object as the first argument. For instance, given:
100 // struct xyz { void foo(int) const; };
102 // xyz's foo member function can be bound as:
108 // member_function_ptr<void, xyz, int> xyz_foo = &xyz::foo;
110 // The template parameter of the member_function_ptr is the return,
111 // class and argument types of actual signature of the function to
112 // be bound read from left to right:
114 // void xyz::foo_(int); ---> member_function_ptr<void, xyz, int>
116 // Take note that a member_function_ptr lazy-function expects the
117 // first argument to be a pointer or reference to an object. Both
118 // the object (reference or pointer) and the arguments can be
119 // lazily bound. Examples:
122 // xyz_foo(arg1, arg2) // arg1.foo(arg2)
123 // xyz_foo(obj, arg1) // obj.foo(arg1)
124 // xyz_foo(obj, 100) // obj.foo(100)
126 // Be reminded that var(obj) must be used to call non-const member
127 // functions. For example, if xyz was declared as:
129 // struct xyz { void foo(int); };
131 // the pointer or reference to the object must also be non-const.
132 // Lazily bound arguments are stored as const value by default (see
133 // variable class in primitives.hpp).
135 // xyz_foo(var(obj), 100) // obj.foo(100)
137 // Finally, member variables can be bound much like member
138 // functions. For instance, given:
140 // struct xyz { int v; };
142 // xyz::v can be bound as:
147 // member_var_ptr<int, xyz> xyz_v = &xyz::v;
149 // The template parameter of the member_var_ptr is the type of the
150 // variable followed by the class:
152 // int xyz::v; ---> member_var_ptr<int, xyz>
154 // Just like the member_function_ptr, member_var_ptr also expects
155 // the first argument to be a pointer or reference to an object.
156 // Both the object (reference or pointer) and the arguments can be
157 // lazily bound. Examples:
160 // xyz_v(arg1) // arg1.v
161 // xyz_v(obj) // obj.v
163 ///////////////////////////////////////////////////////////////////////////////
165 ///////////////////////////////////////////////////////////////////////////////
169 ///////////////////////////////////////////////////////////////////////////////
170 template <typename FuncT>
171 struct functor_action : public FuncT {
173 #if !defined(__BORLANDC__) && (!defined(__MWERKS__) || (__MWERKS__ > 0x3002))
180 #if PHOENIX_LIMIT > 3
185 #if PHOENIX_LIMIT > 6
190 #if PHOENIX_LIMIT > 9
195 #if PHOENIX_LIMIT > 12
205 struct result { typedef typename FuncT::result_type type; };
208 functor_action(FuncT fptr_ = FuncT())
212 #if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
214 ///////////////////////////////////////////////////////////////////////////////
216 // The following specializations are needed because Borland and CodeWarrior
217 // does not accept default template arguments in nested template classes in
218 // classes (i.e functor_action::result)
220 ///////////////////////////////////////////////////////////////////////////////
221 template <typename FuncT, typename TupleT>
222 struct composite0_result<functor_action<FuncT>, TupleT> {
224 typedef typename FuncT::result_type type;
227 //////////////////////////////////
228 template <typename FuncT, typename TupleT,
230 struct composite1_result<functor_action<FuncT>, TupleT, A> {
232 typedef typename FuncT::result_type type;
235 //////////////////////////////////
236 template <typename FuncT, typename TupleT,
237 typename A, typename B>
238 struct composite2_result<functor_action<FuncT>, TupleT, A, B> {
240 typedef typename FuncT::result_type type;
243 //////////////////////////////////
244 template <typename FuncT, typename TupleT,
245 typename A, typename B, typename C>
246 struct composite3_result<functor_action<FuncT>, TupleT, A, B, C> {
248 typedef typename FuncT::result_type type;
251 #if PHOENIX_LIMIT > 3
252 //////////////////////////////////
253 template <typename FuncT, typename TupleT,
254 typename A, typename B, typename C, typename D>
255 struct composite4_result<functor_action<FuncT>, TupleT,
258 typedef typename FuncT::result_type type;
261 //////////////////////////////////
262 template <typename FuncT, typename TupleT,
263 typename A, typename B, typename C, typename D, typename E>
264 struct composite5_result<functor_action<FuncT>, TupleT,
267 typedef typename FuncT::result_type type;
270 //////////////////////////////////
271 template <typename FuncT, typename TupleT,
272 typename A, typename B, typename C, typename D, typename E,
274 struct composite6_result<functor_action<FuncT>, TupleT,
277 typedef typename FuncT::result_type type;
280 #if PHOENIX_LIMIT > 6
281 //////////////////////////////////
282 template <typename FuncT, typename TupleT,
283 typename A, typename B, typename C, typename D, typename E,
284 typename F, typename G>
285 struct composite7_result<functor_action<FuncT>, TupleT,
286 A, B, C, D, E, F, G> {
288 typedef typename FuncT::result_type type;
291 //////////////////////////////////
292 template <typename FuncT, typename TupleT,
293 typename A, typename B, typename C, typename D, typename E,
294 typename F, typename G, typename H>
295 struct composite8_result<functor_action<FuncT>, TupleT,
296 A, B, C, D, E, F, G, H> {
298 typedef typename FuncT::result_type type;
301 //////////////////////////////////
302 template <typename FuncT, typename TupleT,
303 typename A, typename B, typename C, typename D, typename E,
304 typename F, typename G, typename H, typename I>
305 struct composite9_result<functor_action<FuncT>, TupleT,
306 A, B, C, D, E, F, G, H, I> {
308 typedef typename FuncT::result_type type;
311 #if PHOENIX_LIMIT > 9
312 //////////////////////////////////
313 template <typename FuncT, typename TupleT,
314 typename A, typename B, typename C, typename D, typename E,
315 typename F, typename G, typename H, typename I, typename J>
316 struct composite10_result<functor_action<FuncT>, TupleT,
317 A, B, C, D, E, F, G, H, I, J> {
319 typedef typename FuncT::result_type type;
322 //////////////////////////////////
323 template <typename FuncT, typename TupleT,
324 typename A, typename B, typename C, typename D, typename E,
325 typename F, typename G, typename H, typename I, typename J,
327 struct composite11_result<functor_action<FuncT>, TupleT,
328 A, B, C, D, E, F, G, H, I, J, K> {
330 typedef typename FuncT::result_type type;
333 //////////////////////////////////
334 template <typename FuncT, typename TupleT,
335 typename A, typename B, typename C, typename D, typename E,
336 typename F, typename G, typename H, typename I, typename J,
337 typename K, typename L>
338 struct composite12_result<functor_action<FuncT>, TupleT,
339 A, B, C, D, E, F, G, H, I, J, K, L> {
341 typedef typename FuncT::result_type type;
344 #if PHOENIX_LIMIT > 12
345 //////////////////////////////////
346 template <typename FuncT, typename TupleT,
347 typename A, typename B, typename C, typename D, typename E,
348 typename F, typename G, typename H, typename I, typename J,
349 typename K, typename L, typename M>
350 struct composite13_result<functor_action<FuncT>, TupleT,
351 A, B, C, D, E, F, G, H, I, J, K, L, M> {
353 typedef typename FuncT::result_type type;
356 //////////////////////////////////
357 template <typename FuncT, typename TupleT,
358 typename A, typename B, typename C, typename D, typename E,
359 typename F, typename G, typename H, typename I, typename J,
360 typename K, typename L, typename M, typename N>
361 struct composite14_result<functor_action<FuncT>, TupleT,
362 A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
364 typedef typename FuncT::result_type type;
367 //////////////////////////////////
368 template <typename FuncT, typename TupleT,
369 typename A, typename B, typename C, typename D, typename E,
370 typename F, typename G, typename H, typename I, typename J,
371 typename K, typename L, typename M, typename N, typename O>
372 struct composite15_result<functor_action<FuncT>, TupleT,
373 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
375 typedef typename FuncT::result_type type;
384 //////////////////////////////////
385 template <typename FuncT>
386 struct functor : public function<functor_action<FuncT> > {
389 : function<functor_action<FuncT> >(functor_action<FuncT>(func)) {};
392 //////////////////////////////////
393 template <typename FuncT>
394 inline functor<FuncT>
397 return functor<FuncT>(func);
400 ///////////////////////////////////////////////////////////////////////////////
402 // Member variable pointer binder
404 ///////////////////////////////////////////////////////////////////////////////
407 //////////////////////////////////
408 template <typename T>
411 typedef T* pointer_type;
413 static T* get(T& ref)
417 //////////////////////////////////
418 template <typename T>
421 typedef T* pointer_type;
423 static T* get(T* ptr)
428 //////////////////////////////////
429 template <typename ActionT, typename ClassT>
430 struct member_var_ptr_action_result {
432 typedef typename ActionT::template result<ClassT>::type type;
435 //////////////////////////////////
436 template <typename T, typename ClassT>
437 struct member_var_ptr_action {
439 typedef member_var_ptr_action<T, ClassT> self_t;
441 template <typename CT>
443 typedef typename boost::mpl::if_<boost::is_const<CT>, T const&, T&
447 typedef T ClassT::*mem_var_ptr_t;
449 member_var_ptr_action(mem_var_ptr_t ptr_)
452 template <typename CT>
453 typename member_var_ptr_action_result<self_t, CT>::type
454 operator()(CT& obj) const
455 { return impl::as_ptr<CT>::get(obj)->*ptr; }
460 //////////////////////////////////
461 template <typename T, typename ClassT>
462 struct member_var_ptr
463 : public function<member_var_ptr_action<T, ClassT> > {
465 member_var_ptr(T ClassT::*mp)
466 : function<member_var_ptr_action<T, ClassT> >
467 (member_var_ptr_action<T, ClassT>(mp)) {}
470 //////////////////////////////////
471 template <typename T, typename ClassT>
472 inline member_var_ptr<T, ClassT>
475 return member_var_ptr<T, ClassT>(mp);
478 ///////////////////////////////////////////////////////////////////////////////
480 // Function pointer binder (main class)
482 ///////////////////////////////////////////////////////////////////////////////
489 #if PHOENIX_LIMIT > 3
494 #if PHOENIX_LIMIT > 6
499 #if PHOENIX_LIMIT > 9
504 #if PHOENIX_LIMIT > 12
514 , typename NU = nil_t // Not used
516 struct function_ptr_action;
518 //////////////////////////////////
525 #if PHOENIX_LIMIT > 3
530 #if PHOENIX_LIMIT > 6
535 #if PHOENIX_LIMIT > 9
540 #if PHOENIX_LIMIT > 12
551 : public function<function_ptr_action<RT
553 #if PHOENIX_LIMIT > 3
555 #if PHOENIX_LIMIT > 6
557 #if PHOENIX_LIMIT > 9
559 #if PHOENIX_LIMIT > 12
567 typedef function_ptr_action<RT
569 #if PHOENIX_LIMIT > 3
571 #if PHOENIX_LIMIT > 6
573 #if PHOENIX_LIMIT > 9
575 #if PHOENIX_LIMIT > 12
583 template <typename FPT>
585 : function<action_t>(action_t(fp)) {}
588 ///////////////////////////////////////////////////////////////////////////////
590 // Function pointer binder (specialization for 0 arg)
592 ///////////////////////////////////////////////////////////////////////////////
593 template <typename RT>
594 struct function_ptr_action<RT,
596 #if PHOENIX_LIMIT > 3
598 #if PHOENIX_LIMIT > 6
600 #if PHOENIX_LIMIT > 9
602 #if PHOENIX_LIMIT > 12
611 typedef RT result_type;
612 typedef RT(*func_ptr_t)();
614 function_ptr_action(func_ptr_t fptr_)
617 result_type operator()() const
623 //////////////////////////////////
624 template <typename RT>
625 inline function_ptr<RT>
628 return function_ptr<RT>(fptr);
631 ///////////////////////////////////////////////////////////////////////////////
633 // Function pointer binder (specialization for 1 arg)
635 ///////////////////////////////////////////////////////////////////////////////
636 template <typename RT, typename A>
637 struct function_ptr_action<RT,
639 #if PHOENIX_LIMIT > 3
641 #if PHOENIX_LIMIT > 6
643 #if PHOENIX_LIMIT > 9
645 #if PHOENIX_LIMIT > 12
654 typedef RT result_type;
655 typedef RT(*func_ptr_t)(A);
657 template <typename A_>
658 struct result { typedef result_type type; };
660 function_ptr_action(func_ptr_t fptr_)
663 result_type operator()(A a) const
669 //////////////////////////////////
670 template <typename RT, typename A>
671 inline function_ptr<RT, A>
674 return function_ptr<RT, A>(fptr);
677 ///////////////////////////////////////////////////////////////////////////////
679 // Function pointer binder (specialization for 2 args)
681 ///////////////////////////////////////////////////////////////////////////////
682 template <typename RT, typename A, typename B>
683 struct function_ptr_action<RT,
685 #if PHOENIX_LIMIT > 3
687 #if PHOENIX_LIMIT > 6
689 #if PHOENIX_LIMIT > 9
691 #if PHOENIX_LIMIT > 12
700 typedef RT result_type;
701 typedef RT(*func_ptr_t)(A, B);
703 template <typename A_, typename B_>
704 struct result { typedef result_type type; };
706 function_ptr_action(func_ptr_t fptr_)
709 result_type operator()(A a, B b) const
710 { return fptr(a, b); }
715 //////////////////////////////////
716 template <typename RT, typename A, typename B>
717 inline function_ptr<RT, A, B>
718 bind(RT(*fptr)(A, B))
720 return function_ptr<RT, A, B>(fptr);
723 ///////////////////////////////////////////////////////////////////////////////
725 // Function pointer binder (specialization for 3 args)
727 ///////////////////////////////////////////////////////////////////////////////
728 template <typename RT, typename A, typename B, typename C>
729 struct function_ptr_action<RT,
731 #if PHOENIX_LIMIT > 3
733 #if PHOENIX_LIMIT > 6
735 #if PHOENIX_LIMIT > 9
737 #if PHOENIX_LIMIT > 12
746 typedef RT result_type;
747 typedef RT(*func_ptr_t)(A, B, C);
749 template <typename A_, typename B_, typename C_>
750 struct result { typedef result_type type; };
752 function_ptr_action(func_ptr_t fptr_)
755 result_type operator()(A a, B b, C c) const
756 { return fptr(a, b, c); }
761 //////////////////////////////////
762 template <typename RT, typename A, typename B, typename C>
763 inline function_ptr<RT, A, B, C>
764 bind(RT(*fptr)(A, B, C))
766 return function_ptr<RT, A, B, C>(fptr);
769 #if PHOENIX_LIMIT > 3
770 ///////////////////////////////////////////////////////////////////////////////
772 // Function pointer binder (specialization for 4 args)
774 ///////////////////////////////////////////////////////////////////////////////
775 template <typename RT, typename A, typename B, typename C, typename D>
776 struct function_ptr_action<RT,
777 A, B, C, D, nil_t, nil_t,
778 #if PHOENIX_LIMIT > 6
780 #if PHOENIX_LIMIT > 9
782 #if PHOENIX_LIMIT > 12
790 typedef RT result_type;
791 typedef RT(*func_ptr_t)(A, B, C, D);
793 template <typename A_, typename B_, typename C_, typename D_>
794 struct result { typedef result_type type; };
796 function_ptr_action(func_ptr_t fptr_)
799 result_type operator()(A a, B b, C c, D d) const
800 { return fptr(a, b, c, d); }
805 //////////////////////////////////
806 template <typename RT, typename A, typename B, typename C, typename D>
807 inline function_ptr<RT, A, B, C, D>
808 bind(RT(*fptr)(A, B, C, D))
810 return function_ptr<RT, A, B, C, D>(fptr);
813 ///////////////////////////////////////////////////////////////////////////////
815 // Function pointer binder (specialization for 5 args)
817 ///////////////////////////////////////////////////////////////////////////////
818 template <typename RT,
819 typename A, typename B, typename C, typename D, typename E
821 struct function_ptr_action<RT,
822 A, B, C, D, E, nil_t,
823 #if PHOENIX_LIMIT > 6
825 #if PHOENIX_LIMIT > 9
827 #if PHOENIX_LIMIT > 12
835 typedef RT result_type;
836 typedef RT(*func_ptr_t)(A, B, C, D, E);
839 typename A_, typename B_, typename C_, typename D_, typename E_
841 struct result { typedef result_type type; };
843 function_ptr_action(func_ptr_t fptr_)
846 result_type operator()(
847 A a, B b, C c, D d, E e
849 { return fptr(a, b, c, d, e); }
854 //////////////////////////////////
855 template <typename RT,
856 typename A, typename B, typename C, typename D, typename E
858 inline function_ptr<RT, A, B, C, D, E>
859 bind(RT(*fptr)(A, B, C, D, E))
861 return function_ptr<RT, A, B, C, D, E>(fptr);
864 ///////////////////////////////////////////////////////////////////////////////
866 // Function pointer binder (specialization for 6 args)
868 ///////////////////////////////////////////////////////////////////////////////
869 template <typename RT,
870 typename A, typename B, typename C, typename D, typename E,
873 struct function_ptr_action<RT,
875 #if PHOENIX_LIMIT > 6
877 #if PHOENIX_LIMIT > 9
879 #if PHOENIX_LIMIT > 12
887 typedef RT result_type;
888 typedef RT(*func_ptr_t)(A, B, C, D, E, F);
891 typename A_, typename B_, typename C_, typename D_, typename E_,
894 struct result { typedef result_type type; };
896 function_ptr_action(func_ptr_t fptr_)
899 result_type operator()(
900 A a, B b, C c, D d, E e,
903 { return fptr(a, b, c, d, e, f); }
908 //////////////////////////////////
909 template <typename RT,
910 typename A, typename B, typename C, typename D, typename E,
913 inline function_ptr<RT, A, B, C, D, E, F>
914 bind(RT(*fptr)(A, B, C, D, E, F))
916 return function_ptr<RT, A, B, C, D, E, F>(fptr);
919 #if PHOENIX_LIMIT > 6
920 ///////////////////////////////////////////////////////////////////////////////
922 // Function pointer binder (specialization for 7 args)
924 ///////////////////////////////////////////////////////////////////////////////
925 template <typename RT,
926 typename A, typename B, typename C, typename D, typename E,
927 typename F, typename G
929 struct function_ptr_action<RT,
930 A, B, C, D, E, F, G, nil_t, nil_t,
931 #if PHOENIX_LIMIT > 9
933 #if PHOENIX_LIMIT > 12
940 typedef RT result_type;
941 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G);
944 typename A_, typename B_, typename C_, typename D_, typename E_,
945 typename F_, typename G_
947 struct result { typedef result_type type; };
949 function_ptr_action(func_ptr_t fptr_)
952 result_type operator()(
953 A a, B b, C c, D d, E e,
956 { return fptr(a, b, c, d, e, f, g); }
961 //////////////////////////////////
962 template <typename RT,
963 typename A, typename B, typename C, typename D, typename E,
964 typename F, typename G
966 inline function_ptr<RT, A, B, C, D, E, F, G>
967 bind(RT(*fptr)(A, B, C, D, E, F, G))
969 return function_ptr<RT, A, B, C, D, E, F, G>(fptr);
972 ///////////////////////////////////////////////////////////////////////////////
974 // Function pointer binder (specialization for 8 args)
976 ///////////////////////////////////////////////////////////////////////////////
977 template <typename RT,
978 typename A, typename B, typename C, typename D, typename E,
979 typename F, typename G, typename H
981 struct function_ptr_action<RT,
982 A, B, C, D, E, F, G, H, nil_t,
983 #if PHOENIX_LIMIT > 9
985 #if PHOENIX_LIMIT > 12
992 typedef RT result_type;
993 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H);
996 typename A_, typename B_, typename C_, typename D_, typename E_,
997 typename F_, typename G_, typename H_
999 struct result { typedef result_type type; };
1001 function_ptr_action(func_ptr_t fptr_)
1004 result_type operator()(
1005 A a, B b, C c, D d, E e,
1008 { return fptr(a, b, c, d, e, f, g, h); }
1013 //////////////////////////////////
1014 template <typename RT,
1015 typename A, typename B, typename C, typename D, typename E,
1016 typename F, typename G, typename H
1018 inline function_ptr<RT, A, B, C, D, E, F, G, H>
1019 bind(RT(*fptr)(A, B, C, D, E, F, G, H))
1021 return function_ptr<RT, A, B, C, D, E, F, G, H>(fptr);
1024 ///////////////////////////////////////////////////////////////////////////////
1026 // Function pointer binder (specialization for 9 args)
1028 ///////////////////////////////////////////////////////////////////////////////
1029 template <typename RT,
1030 typename A, typename B, typename C, typename D, typename E,
1031 typename F, typename G, typename H, typename I
1033 struct function_ptr_action<RT,
1034 A, B, C, D, E, F, G, H, I,
1035 #if PHOENIX_LIMIT > 9
1036 nil_t, nil_t, nil_t,
1037 #if PHOENIX_LIMIT > 12
1038 nil_t, nil_t, nil_t,
1044 typedef RT result_type;
1045 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I);
1048 typename A_, typename B_, typename C_, typename D_, typename E_,
1049 typename F_, typename G_, typename H_, typename I_
1051 struct result { typedef result_type type; };
1053 function_ptr_action(func_ptr_t fptr_)
1056 result_type operator()(
1057 A a, B b, C c, D d, E e,
1060 { return fptr(a, b, c, d, e, f, g, h, i); }
1065 //////////////////////////////////
1066 template <typename RT,
1067 typename A, typename B, typename C, typename D, typename E,
1068 typename F, typename G, typename H, typename I
1070 inline function_ptr<RT, A, B, C, D, E, F, G, H, I>
1071 bind(RT(*fptr)(A, B, C, D, E, F, G, H, I))
1073 return function_ptr<RT, A, B, C, D, E, F, G, H, I>(fptr);
1076 #if PHOENIX_LIMIT > 9
1077 ///////////////////////////////////////////////////////////////////////////////
1079 // Function pointer binder (specialization for 10 args)
1081 ///////////////////////////////////////////////////////////////////////////////
1082 template <typename RT,
1083 typename A, typename B, typename C, typename D, typename E,
1084 typename F, typename G, typename H, typename I, typename J
1086 struct function_ptr_action<RT,
1087 A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
1088 #if PHOENIX_LIMIT > 12
1089 nil_t, nil_t, nil_t,
1094 typedef RT result_type;
1095 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J);
1098 typename A_, typename B_, typename C_, typename D_, typename E_,
1099 typename F_, typename G_, typename H_, typename I_, typename J_
1101 struct result { typedef result_type type; };
1103 function_ptr_action(func_ptr_t fptr_)
1106 result_type operator()(
1107 A a, B b, C c, D d, E e,
1108 F f, G g, H h, I i, J j
1110 { return fptr(a, b, c, d, e, f, g, h, i, j); }
1115 //////////////////////////////////
1116 template <typename RT,
1117 typename A, typename B, typename C, typename D, typename E,
1118 typename F, typename G, typename H, typename I, typename J
1120 inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J>
1121 bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J))
1123 return function_ptr<RT, A, B, C, D, E, F, G, H, I, J>(fptr);
1126 ///////////////////////////////////////////////////////////////////////////////
1128 // Function pointer binder (specialization for 11 args)
1130 ///////////////////////////////////////////////////////////////////////////////
1131 template <typename RT,
1132 typename A, typename B, typename C, typename D, typename E,
1133 typename F, typename G, typename H, typename I, typename J,
1136 struct function_ptr_action<RT,
1137 A, B, C, D, E, F, G, H, I, J, K, nil_t,
1138 #if PHOENIX_LIMIT > 12
1139 nil_t, nil_t, nil_t,
1144 typedef RT result_type;
1145 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K);
1148 typename A_, typename B_, typename C_, typename D_, typename E_,
1149 typename F_, typename G_, typename H_, typename I_, typename J_,
1152 struct result { typedef result_type type; };
1154 function_ptr_action(func_ptr_t fptr_)
1157 result_type operator()(
1158 A a, B b, C c, D d, E e,
1159 F f, G g, H h, I i, J j,
1162 { return fptr(a, b, c, d, e, f, g, h, i, j, k); }
1167 //////////////////////////////////
1168 template <typename RT,
1169 typename A, typename B, typename C, typename D, typename E,
1170 typename F, typename G, typename H, typename I, typename J,
1173 inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K>
1174 bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K))
1176 return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K>(fptr);
1179 ///////////////////////////////////////////////////////////////////////////////
1181 // Function pointer binder (specialization for 12 args)
1183 ///////////////////////////////////////////////////////////////////////////////
1184 template <typename RT,
1185 typename A, typename B, typename C, typename D, typename E,
1186 typename F, typename G, typename H, typename I, typename J,
1187 typename K, typename L
1189 struct function_ptr_action<RT,
1190 A, B, C, D, E, F, G, H, I, J, K, L,
1191 #if PHOENIX_LIMIT > 12
1192 nil_t, nil_t, nil_t,
1197 typedef RT result_type;
1198 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L);
1201 typename A_, typename B_, typename C_, typename D_, typename E_,
1202 typename F_, typename G_, typename H_, typename I_, typename J_,
1203 typename K_, typename L_
1205 struct result { typedef result_type type; };
1207 function_ptr_action(func_ptr_t fptr_)
1210 result_type operator()(
1211 A a, B b, C c, D d, E e,
1212 F f, G g, H h, I i, J j,
1215 { return fptr(a, b, c, d, e, f, g, h, i, j, k, l); }
1220 //////////////////////////////////
1221 template <typename RT,
1222 typename A, typename B, typename C, typename D, typename E,
1223 typename F, typename G, typename H, typename I, typename J,
1224 typename K, typename L
1226 inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L>
1227 bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
1229 return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
1232 #if PHOENIX_LIMIT > 12
1233 ///////////////////////////////////////////////////////////////////////////////
1235 // Function pointer binder (specialization for 13 args)
1237 ///////////////////////////////////////////////////////////////////////////////
1238 template <typename RT,
1239 typename A, typename B, typename C, typename D, typename E,
1240 typename F, typename G, typename H, typename I, typename J,
1241 typename K, typename L, typename M
1243 struct function_ptr_action<RT,
1244 A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
1246 typedef RT result_type;
1247 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M);
1250 typename A_, typename B_, typename C_, typename D_, typename E_,
1251 typename F_, typename G_, typename H_, typename I_, typename J_,
1252 typename K_, typename L_, typename M_
1254 struct result { typedef result_type type; };
1256 function_ptr_action(func_ptr_t fptr_)
1259 result_type operator()(
1260 A a, B b, C c, D d, E e,
1261 F f, G g, H h, I i, J j,
1264 { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m); }
1269 //////////////////////////////////
1270 template <typename RT,
1271 typename A, typename B, typename C, typename D, typename E,
1272 typename F, typename G, typename H, typename I, typename J,
1273 typename K, typename L, typename M
1275 inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M>
1276 bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
1278 return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
1281 ///////////////////////////////////////////////////////////////////////////////
1283 // Function pointer binder (specialization for 14 args)
1285 ///////////////////////////////////////////////////////////////////////////////
1286 template <typename RT,
1287 typename A, typename B, typename C, typename D, typename E,
1288 typename F, typename G, typename H, typename I, typename J,
1289 typename K, typename L, typename M, typename N
1291 struct function_ptr_action<RT,
1292 A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
1294 typedef RT result_type;
1295 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
1298 typename A_, typename B_, typename C_, typename D_, typename E_,
1299 typename F_, typename G_, typename H_, typename I_, typename J_,
1300 typename K_, typename L_, typename M_, typename N_
1302 struct result { typedef result_type type; };
1304 function_ptr_action(func_ptr_t fptr_)
1307 result_type operator()(
1308 A a, B b, C c, D d, E e,
1309 F f, G g, H h, I i, J j,
1312 { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m, n); }
1317 //////////////////////////////////
1318 template <typename RT,
1319 typename A, typename B, typename C, typename D, typename E,
1320 typename F, typename G, typename H, typename I, typename J,
1321 typename K, typename L, typename M, typename N
1323 inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
1324 bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
1326 return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
1329 ///////////////////////////////////////////////////////////////////////////////
1331 // Function pointer binder (specialization for 15 args)
1333 ///////////////////////////////////////////////////////////////////////////////
1334 template <typename RT,
1335 typename A, typename B, typename C, typename D, typename E,
1336 typename F, typename G, typename H, typename I, typename J,
1337 typename K, typename L, typename M, typename N, typename O
1339 struct function_ptr_action<RT,
1340 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
1342 typedef RT result_type;
1343 typedef RT(*func_ptr_t)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
1346 typename A_, typename B_, typename C_, typename D_, typename E_,
1347 typename F_, typename G_, typename H_, typename I_, typename J_,
1348 typename K_, typename L_, typename M_, typename N_, typename O_
1350 struct result { typedef result_type type; };
1352 function_ptr_action(func_ptr_t fptr_)
1355 result_type operator()(
1356 A a, B b, C c, D d, E e,
1357 F f, G g, H h, I i, J j,
1358 K k, L l, M m, N n, O o
1360 { return fptr(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o); }
1365 //////////////////////////////////
1366 template <typename RT,
1367 typename A, typename B, typename C, typename D, typename E,
1368 typename F, typename G, typename H, typename I, typename J,
1369 typename K, typename L, typename M, typename N, typename O
1371 inline function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
1372 bind(RT(*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
1374 return function_ptr<RT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
1381 ///////////////////////////////////////////////////////////////////////////////
1383 // Member function pointer binder (main class)
1385 ///////////////////////////////////////////////////////////////////////////////
1389 , typename A = nil_t
1390 , typename B = nil_t
1391 , typename C = nil_t
1393 #if PHOENIX_LIMIT > 3
1394 , typename D = nil_t
1395 , typename E = nil_t
1396 , typename F = nil_t
1398 #if PHOENIX_LIMIT > 6
1399 , typename G = nil_t
1400 , typename H = nil_t
1401 , typename I = nil_t
1403 #if PHOENIX_LIMIT > 9
1404 , typename J = nil_t
1405 , typename K = nil_t
1406 , typename L = nil_t
1408 #if PHOENIX_LIMIT > 12
1409 , typename M = nil_t
1410 , typename N = nil_t
1411 , typename O = nil_t
1418 , typename NU = nil_t // Not used
1420 struct member_function_ptr_action;
1422 //////////////////////////////////
1426 , typename A = nil_t
1427 , typename B = nil_t
1428 , typename C = nil_t
1430 #if PHOENIX_LIMIT > 3
1431 , typename D = nil_t
1432 , typename E = nil_t
1433 , typename F = nil_t
1435 #if PHOENIX_LIMIT > 6
1436 , typename G = nil_t
1437 , typename H = nil_t
1438 , typename I = nil_t
1440 #if PHOENIX_LIMIT > 9
1441 , typename J = nil_t
1442 , typename K = nil_t
1443 , typename L = nil_t
1445 #if PHOENIX_LIMIT > 12
1446 , typename M = nil_t
1447 , typename N = nil_t
1448 , typename O = nil_t
1455 struct member_function_ptr
1456 : public function<member_function_ptr_action<RT, ClassT
1458 #if PHOENIX_LIMIT > 3
1460 #if PHOENIX_LIMIT > 6
1462 #if PHOENIX_LIMIT > 9
1464 #if PHOENIX_LIMIT > 12
1472 typedef member_function_ptr_action<RT, ClassT
1474 #if PHOENIX_LIMIT > 3
1476 #if PHOENIX_LIMIT > 6
1478 #if PHOENIX_LIMIT > 9
1480 #if PHOENIX_LIMIT > 12
1488 template <typename FPT>
1489 member_function_ptr(FPT fp)
1490 : function<action_t>(action_t(fp)) {}
1493 ///////////////////////////////////////////////////////////////////////////////
1495 // Member function pointer binder (specialization for 0 arg)
1497 ///////////////////////////////////////////////////////////////////////////////
1498 template <typename RT, typename ClassT>
1499 struct member_function_ptr_action<RT, ClassT,
1500 nil_t, nil_t, nil_t,
1501 #if PHOENIX_LIMIT > 3
1502 nil_t, nil_t, nil_t,
1503 #if PHOENIX_LIMIT > 6
1504 nil_t, nil_t, nil_t,
1505 #if PHOENIX_LIMIT > 9
1506 nil_t, nil_t, nil_t,
1507 #if PHOENIX_LIMIT > 12
1508 nil_t, nil_t, nil_t,
1516 typedef RT result_type;
1517 typedef RT(ClassT::*mf)();
1518 typedef RT(ClassT::*cmf)() const;
1519 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1522 template <typename CT>
1523 struct result { typedef result_type type; };
1525 member_function_ptr_action(mem_func_ptr_t fptr_)
1528 template <typename CT>
1529 result_type operator()(CT& obj) const
1530 { return (impl::as_ptr<CT>::get(obj)->*fptr)(); }
1532 mem_func_ptr_t fptr;
1535 //////////////////////////////////
1536 template <typename RT, typename ClassT>
1537 inline member_function_ptr<RT, ClassT>
1538 bind(RT(ClassT::*fptr)())
1540 return member_function_ptr<RT, ClassT>(fptr);
1543 template <typename RT, typename ClassT>
1544 inline member_function_ptr<RT, ClassT const>
1545 bind(RT(ClassT::*fptr)() const)
1547 return member_function_ptr<RT, ClassT const>(fptr);
1550 ///////////////////////////////////////////////////////////////////////////////
1552 // Member function pointer binder (specialization for 1 arg)
1554 ///////////////////////////////////////////////////////////////////////////////
1555 template <typename RT, typename ClassT, typename A>
1556 struct member_function_ptr_action<RT, ClassT,
1558 #if PHOENIX_LIMIT > 3
1559 nil_t, nil_t, nil_t,
1560 #if PHOENIX_LIMIT > 6
1561 nil_t, nil_t, nil_t,
1562 #if PHOENIX_LIMIT > 9
1563 nil_t, nil_t, nil_t,
1564 #if PHOENIX_LIMIT > 12
1565 nil_t, nil_t, nil_t,
1573 typedef RT result_type;
1574 typedef RT(ClassT::*mf)(A);
1575 typedef RT(ClassT::*cmf)(A) const;
1576 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1579 template <typename CT, typename A_>
1580 struct result { typedef result_type type; };
1582 member_function_ptr_action(mem_func_ptr_t fptr_)
1585 template <typename CT>
1586 result_type operator()(CT& obj, A a) const
1587 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a); }
1589 mem_func_ptr_t fptr;
1592 //////////////////////////////////
1593 template <typename RT, typename ClassT, typename A>
1594 inline member_function_ptr<RT, ClassT, A>
1595 bind(RT(ClassT::*fptr)(A))
1597 return member_function_ptr<RT, ClassT, A>(fptr);
1600 //////////////////////////////////
1601 template <typename RT, typename ClassT, typename A>
1602 inline member_function_ptr<RT, ClassT const, A>
1603 bind(RT(ClassT::*fptr)(A) const)
1605 return member_function_ptr<RT, ClassT const, A>(fptr);
1608 ///////////////////////////////////////////////////////////////////////////////
1610 // Member function pointer binder (specialization for 2 args)
1612 ///////////////////////////////////////////////////////////////////////////////
1613 template <typename RT, typename ClassT, typename A, typename B>
1614 struct member_function_ptr_action<RT, ClassT,
1616 #if PHOENIX_LIMIT > 3
1617 nil_t, nil_t, nil_t,
1618 #if PHOENIX_LIMIT > 6
1619 nil_t, nil_t, nil_t,
1620 #if PHOENIX_LIMIT > 9
1621 nil_t, nil_t, nil_t,
1622 #if PHOENIX_LIMIT > 12
1623 nil_t, nil_t, nil_t,
1631 typedef RT result_type;
1632 typedef RT(ClassT::*mf)(A, B);
1633 typedef RT(ClassT::*cmf)(A, B) const;
1634 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1637 template <typename CT, typename A_, typename B_>
1638 struct result { typedef result_type type; };
1640 member_function_ptr_action(mem_func_ptr_t fptr_)
1643 template <typename CT>
1644 result_type operator()(CT& obj, A a, B b) const
1645 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b); }
1647 mem_func_ptr_t fptr;
1650 //////////////////////////////////
1651 template <typename RT, typename ClassT, typename A, typename B>
1652 inline member_function_ptr<RT, ClassT, A, B>
1653 bind(RT(ClassT::*fptr)(A, B))
1655 return member_function_ptr<RT, ClassT, A, B>(fptr);
1658 //////////////////////////////////
1659 template <typename RT, typename ClassT, typename A, typename B>
1660 inline member_function_ptr<RT, ClassT const, A, B>
1661 bind(RT(ClassT::*fptr)(A, B) const)
1663 return member_function_ptr<RT, ClassT const, A, B>(fptr);
1666 #if PHOENIX_LIMIT > 3
1667 ///////////////////////////////////////////////////////////////////////////////
1669 // Member function pointer binder (specialization for 3 args)
1671 ///////////////////////////////////////////////////////////////////////////////
1672 template <typename RT, typename ClassT, typename A, typename B, typename C>
1673 struct member_function_ptr_action<RT, ClassT,
1674 A, B, C, nil_t, nil_t, nil_t,
1675 #if PHOENIX_LIMIT > 6
1676 nil_t, nil_t, nil_t,
1677 #if PHOENIX_LIMIT > 9
1678 nil_t, nil_t, nil_t,
1679 #if PHOENIX_LIMIT > 12
1680 nil_t, nil_t, nil_t,
1687 typedef RT result_type;
1688 typedef RT(ClassT::*mf)(A, B, C);
1689 typedef RT(ClassT::*cmf)(A, B, C) const;
1690 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1693 template <typename CT, typename A_, typename B_, typename C_>
1694 struct result { typedef result_type type; };
1696 member_function_ptr_action(mem_func_ptr_t fptr_)
1699 template <typename CT>
1700 result_type operator()(CT& obj, A a, B b, C c) const
1701 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c); }
1703 mem_func_ptr_t fptr;
1706 //////////////////////////////////
1707 template <typename RT, typename ClassT, typename A, typename B, typename C>
1708 inline member_function_ptr<RT, ClassT, A, B, C>
1709 bind(RT(ClassT::*fptr)(A, B, C))
1711 return member_function_ptr<RT, ClassT, A, B, C>(fptr);
1714 //////////////////////////////////
1715 template <typename RT, typename ClassT, typename A, typename B, typename C>
1716 inline member_function_ptr<RT, ClassT const, A, B, C>
1717 bind(RT(ClassT::*fptr)(A, B, C) const)
1719 return member_function_ptr<RT, ClassT const, A, B, C>(fptr);
1722 ///////////////////////////////////////////////////////////////////////////////
1724 // Member function pointer binder (specialization for 4 args)
1726 ///////////////////////////////////////////////////////////////////////////////
1727 template <typename RT, typename ClassT,
1728 typename A, typename B, typename C, typename D
1730 struct member_function_ptr_action<RT, ClassT,
1731 A, B, C, D, nil_t, nil_t,
1732 #if PHOENIX_LIMIT > 6
1733 nil_t, nil_t, nil_t,
1734 #if PHOENIX_LIMIT > 9
1735 nil_t, nil_t, nil_t,
1736 #if PHOENIX_LIMIT > 12
1737 nil_t, nil_t, nil_t,
1744 typedef RT result_type;
1745 typedef RT(ClassT::*mf)(A, B, C, D);
1746 typedef RT(ClassT::*cmf)(A, B, C, D) const;
1747 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1750 template <typename CT,
1751 typename A_, typename B_, typename C_, typename D_
1753 struct result { typedef result_type type; };
1755 member_function_ptr_action(mem_func_ptr_t fptr_)
1758 template <typename CT>
1759 result_type operator()(CT& obj,
1762 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d); }
1764 mem_func_ptr_t fptr;
1767 //////////////////////////////////
1768 template <typename RT, typename ClassT,
1769 typename A, typename B, typename C, typename D
1771 inline member_function_ptr<RT, ClassT, A, B, C, D>
1772 bind(RT(ClassT::*fptr)(A, B, C, D))
1774 return member_function_ptr<
1775 RT, ClassT, A, B, C, D>(fptr);
1778 //////////////////////////////////
1779 template <typename RT, typename ClassT,
1780 typename A, typename B, typename C, typename D
1782 inline member_function_ptr<RT, ClassT const, A, B, C, D>
1783 bind(RT(ClassT::*fptr)(A, B, C, D) const)
1785 return member_function_ptr<
1786 RT, ClassT const, A, B, C, D>(fptr);
1789 ///////////////////////////////////////////////////////////////////////////////
1791 // Member function pointer binder (specialization for 5 args)
1793 ///////////////////////////////////////////////////////////////////////////////
1794 template <typename RT, typename ClassT,
1795 typename A, typename B, typename C, typename D,
1798 struct member_function_ptr_action<RT, ClassT,
1799 A, B, C, D, E, nil_t,
1800 #if PHOENIX_LIMIT > 6
1801 nil_t, nil_t, nil_t,
1802 #if PHOENIX_LIMIT > 9
1803 nil_t, nil_t, nil_t,
1804 #if PHOENIX_LIMIT > 12
1805 nil_t, nil_t, nil_t,
1812 typedef RT result_type;
1813 typedef RT(ClassT::*mf)(A, B, C, D, E);
1814 typedef RT(ClassT::*cmf)(A, B, C, D, E) const;
1815 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1818 template <typename CT,
1819 typename A_, typename B_, typename C_, typename D_,
1822 struct result { typedef result_type type; };
1824 member_function_ptr_action(mem_func_ptr_t fptr_)
1827 template <typename CT>
1828 result_type operator()(CT& obj,
1829 A a, B b, C c, D d, E e
1831 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e); }
1833 mem_func_ptr_t fptr;
1836 //////////////////////////////////
1837 template <typename RT, typename ClassT,
1838 typename A, typename B, typename C, typename D,
1841 inline member_function_ptr<RT, ClassT, A, B, C, D, E>
1842 bind(RT(ClassT::*fptr)(A, B, C, D, E))
1844 return member_function_ptr<
1845 RT, ClassT, A, B, C, D, E>(fptr);
1848 //////////////////////////////////
1849 template <typename RT, typename ClassT,
1850 typename A, typename B, typename C, typename D,
1853 inline member_function_ptr<RT, ClassT const, A, B, C, D, E>
1854 bind(RT(ClassT::*fptr)(A, B, C, D, E) const)
1856 return member_function_ptr<
1857 RT, ClassT const, A, B, C, D, E>(fptr);
1860 #if PHOENIX_LIMIT > 6
1861 ///////////////////////////////////////////////////////////////////////////////
1863 // Member function pointer binder (specialization for 6 args)
1865 ///////////////////////////////////////////////////////////////////////////////
1866 template <typename RT, typename ClassT,
1867 typename A, typename B, typename C, typename D,
1868 typename E, typename F
1870 struct member_function_ptr_action<RT, ClassT,
1871 A, B, C, D, E, F, nil_t, nil_t, nil_t,
1872 #if PHOENIX_LIMIT > 9
1873 nil_t, nil_t, nil_t,
1874 #if PHOENIX_LIMIT > 12
1875 nil_t, nil_t, nil_t,
1881 typedef RT result_type;
1882 typedef RT(ClassT::*mf)(A, B, C, D, E, F);
1883 typedef RT(ClassT::*cmf)(A, B, C, D, E, F) const;
1884 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1887 template <typename CT,
1888 typename A_, typename B_, typename C_, typename D_,
1889 typename E_, typename F_
1891 struct result { typedef result_type type; };
1893 member_function_ptr_action(mem_func_ptr_t fptr_)
1896 template <typename CT>
1897 result_type operator()(CT& obj,
1898 A a, B b, C c, D d, E e, F f
1900 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f); }
1902 mem_func_ptr_t fptr;
1905 //////////////////////////////////
1906 template <typename RT, typename ClassT,
1907 typename A, typename B, typename C, typename D,
1908 typename E, typename F
1910 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F>
1911 bind(RT(ClassT::*fptr)(A, B, C, D, E, F))
1913 return member_function_ptr<
1914 RT, ClassT, A, B, C, D, E, F>(fptr);
1917 //////////////////////////////////
1918 template <typename RT, typename ClassT,
1919 typename A, typename B, typename C, typename D,
1920 typename E, typename F
1922 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F>
1923 bind(RT(ClassT::*fptr)(A, B, C, D, E, F) const)
1925 return member_function_ptr<
1926 RT, ClassT const, A, B, C, D, E, F>(fptr);
1929 ///////////////////////////////////////////////////////////////////////////////
1931 // Member function pointer binder (specialization for 7 args)
1933 ///////////////////////////////////////////////////////////////////////////////
1934 template <typename RT, typename ClassT,
1935 typename A, typename B, typename C, typename D,
1936 typename E, typename F, typename G
1938 struct member_function_ptr_action<RT, ClassT,
1939 A, B, C, D, E, F, G, nil_t, nil_t,
1940 #if PHOENIX_LIMIT > 9
1941 nil_t, nil_t, nil_t,
1942 #if PHOENIX_LIMIT > 12
1943 nil_t, nil_t, nil_t,
1949 typedef RT result_type;
1950 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G);
1951 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G) const;
1952 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
1955 template <typename CT,
1956 typename A_, typename B_, typename C_, typename D_,
1957 typename E_, typename F_, typename G_
1959 struct result { typedef result_type type; };
1961 member_function_ptr_action(mem_func_ptr_t fptr_)
1964 template <typename CT>
1965 result_type operator()(CT& obj,
1966 A a, B b, C c, D d, E e, F f, G g
1968 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g); }
1970 mem_func_ptr_t fptr;
1973 //////////////////////////////////
1974 template <typename RT, typename ClassT,
1975 typename A, typename B, typename C, typename D,
1976 typename E, typename F, typename G
1978 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G>
1979 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G))
1981 return member_function_ptr<
1982 RT, ClassT, A, B, C, D, E, F, G>(fptr);
1985 //////////////////////////////////
1986 template <typename RT, typename ClassT,
1987 typename A, typename B, typename C, typename D,
1988 typename E, typename F, typename G
1990 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G>
1991 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
1993 return member_function_ptr<
1994 RT, ClassT const, A, B, C, D, E, F, G>(fptr);
1997 ///////////////////////////////////////////////////////////////////////////////
1999 // Member function pointer binder (specialization for 8 args)
2001 ///////////////////////////////////////////////////////////////////////////////
2002 template <typename RT, typename ClassT,
2003 typename A, typename B, typename C, typename D,
2004 typename E, typename F, typename G, typename H
2006 struct member_function_ptr_action<RT, ClassT,
2007 A, B, C, D, E, F, G, H, nil_t,
2008 #if PHOENIX_LIMIT > 9
2009 nil_t, nil_t, nil_t,
2010 #if PHOENIX_LIMIT > 12
2011 nil_t, nil_t, nil_t,
2017 typedef RT result_type;
2018 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H);
2019 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H) const;
2020 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2023 template <typename CT,
2024 typename A_, typename B_, typename C_, typename D_,
2025 typename E_, typename F_, typename G_, typename H_
2027 struct result { typedef result_type type; };
2029 member_function_ptr_action(mem_func_ptr_t fptr_)
2032 template <typename CT>
2033 result_type operator()(CT& obj,
2034 A a, B b, C c, D d, E e, F f, G g, H h
2036 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g, h); }
2038 mem_func_ptr_t fptr;
2041 //////////////////////////////////
2042 template <typename RT, typename ClassT,
2043 typename A, typename B, typename C, typename D,
2044 typename E, typename F, typename G, typename H
2046 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H>
2047 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
2049 return member_function_ptr<
2050 RT, ClassT, A, B, C, D, E, F, G, H>(fptr);
2053 //////////////////////////////////
2054 template <typename RT, typename ClassT,
2055 typename A, typename B, typename C, typename D,
2056 typename E, typename F, typename G, typename H
2058 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H>
2059 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
2061 return member_function_ptr<
2062 RT, ClassT const, A, B, C, D, E, F, G, H>(fptr);
2065 #if PHOENIX_LIMIT > 9
2066 ///////////////////////////////////////////////////////////////////////////////
2068 // Member function pointer binder (specialization for 9 args)
2070 ///////////////////////////////////////////////////////////////////////////////
2071 template <typename RT, typename ClassT,
2072 typename A, typename B, typename C, typename D,
2073 typename E, typename F, typename G, typename H, typename I
2075 struct member_function_ptr_action<RT, ClassT,
2076 A, B, C, D, E, F, G, H, I, nil_t, nil_t, nil_t,
2077 #if PHOENIX_LIMIT > 12
2078 nil_t, nil_t, nil_t,
2083 typedef RT result_type;
2084 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I);
2085 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I) const;
2086 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2089 template <typename CT,
2090 typename A_, typename B_, typename C_, typename D_,
2091 typename E_, typename F_, typename G_, typename H_, typename I_
2093 struct result { typedef result_type type; };
2095 member_function_ptr_action(mem_func_ptr_t fptr_)
2098 template <typename CT>
2099 result_type operator()(CT& obj,
2100 A a, B b, C c, D d, E e, F f, G g, H h, I i
2102 { return (impl::as_ptr<CT>::get(obj)->*fptr)(a, b, c, d, e, f, g, h, i); }
2104 mem_func_ptr_t fptr;
2107 //////////////////////////////////
2108 template <typename RT, typename ClassT,
2109 typename A, typename B, typename C, typename D,
2110 typename E, typename F, typename G, typename H, typename I
2112 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I>
2113 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
2115 return member_function_ptr<
2116 RT, ClassT, A, B, C, D, E, F, G, H, I>(fptr);
2119 //////////////////////////////////
2120 template <typename RT, typename ClassT,
2121 typename A, typename B, typename C, typename D,
2122 typename E, typename F, typename G, typename H, typename I
2124 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I>
2125 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
2127 return member_function_ptr<
2128 RT, ClassT const, A, B, C, D, E, F, G, H, I>(fptr);
2131 ///////////////////////////////////////////////////////////////////////////////
2133 // Member function pointer binder (specialization for 10 args)
2135 ///////////////////////////////////////////////////////////////////////////////
2136 template <typename RT, typename ClassT,
2137 typename A, typename B, typename C, typename D,
2138 typename E, typename F, typename G, typename H, typename I,
2141 struct member_function_ptr_action<RT, ClassT,
2142 A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
2143 #if PHOENIX_LIMIT > 12
2144 nil_t, nil_t, nil_t,
2149 typedef RT result_type;
2150 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J);
2151 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J) const;
2152 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2155 template <typename CT,
2156 typename A_, typename B_, typename C_, typename D_,
2157 typename E_, typename F_, typename G_, typename H_, typename I_,
2160 struct result { typedef result_type type; };
2162 member_function_ptr_action(mem_func_ptr_t fptr_)
2165 template <typename CT>
2166 result_type operator()(CT& obj,
2167 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j
2170 return (impl::as_ptr<CT>::get(obj)->*fptr)
2171 (a, b, c, d, e, f, g, h, i, j);
2174 mem_func_ptr_t fptr;
2177 //////////////////////////////////
2178 template <typename RT, typename ClassT,
2179 typename A, typename B, typename C, typename D,
2180 typename E, typename F, typename G, typename H, typename I,
2183 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
2184 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
2186 return member_function_ptr<
2187 RT, ClassT, A, B, C, D, E, F, G, H, I, J>(fptr);
2190 //////////////////////////////////
2191 template <typename RT, typename ClassT,
2192 typename A, typename B, typename C, typename D,
2193 typename E, typename F, typename G, typename H, typename I,
2196 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
2197 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
2199 return member_function_ptr<
2200 RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(fptr);
2203 ///////////////////////////////////////////////////////////////////////////////
2205 // Member function pointer binder (specialization for 11 args)
2207 ///////////////////////////////////////////////////////////////////////////////
2208 template <typename RT, typename ClassT,
2209 typename A, typename B, typename C, typename D,
2210 typename E, typename F, typename G, typename H, typename I,
2211 typename J, typename K
2213 struct member_function_ptr_action<RT, ClassT,
2214 A, B, C, D, E, F, G, H, I, J, K, nil_t,
2215 #if PHOENIX_LIMIT > 12
2216 nil_t, nil_t, nil_t,
2221 typedef RT result_type;
2222 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K);
2223 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K) const;
2224 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2227 template <typename CT,
2228 typename A_, typename B_, typename C_, typename D_,
2229 typename E_, typename F_, typename G_, typename H_, typename I_,
2230 typename J_, typename K_
2232 struct result { typedef result_type type; };
2234 member_function_ptr_action(mem_func_ptr_t fptr_)
2237 template <typename CT>
2238 result_type operator()(CT& obj,
2239 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k
2242 return (impl::as_ptr<CT>::get(obj)->*fptr)
2243 (a, b, c, d, e, f, g, h, i, j, k);
2246 mem_func_ptr_t fptr;
2249 //////////////////////////////////
2250 template <typename RT, typename ClassT,
2251 typename A, typename B, typename C, typename D,
2252 typename E, typename F, typename G, typename H, typename I,
2253 typename J, typename K
2255 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
2256 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
2258 return member_function_ptr<
2259 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(fptr);
2262 //////////////////////////////////
2263 template <typename RT, typename ClassT,
2264 typename A, typename B, typename C, typename D,
2265 typename E, typename F, typename G, typename H, typename I,
2266 typename J, typename K
2268 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
2269 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
2271 return member_function_ptr<
2272 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(fptr);
2275 #if PHOENIX_LIMIT > 12
2276 ///////////////////////////////////////////////////////////////////////////////
2278 // Member function pointer binder (specialization for 12 args)
2280 ///////////////////////////////////////////////////////////////////////////////
2281 template <typename RT, typename ClassT,
2282 typename A, typename B, typename C, typename D,
2283 typename E, typename F, typename G, typename H, typename I,
2284 typename J, typename K, typename L
2286 struct member_function_ptr_action<RT, ClassT,
2287 A, B, C, D, E, F, G, H, I, J, K, L, nil_t, nil_t, nil_t, nil_t> {
2289 typedef RT result_type;
2290 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L);
2291 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L) const;
2292 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2295 template <typename CT,
2296 typename A_, typename B_, typename C_, typename D_,
2297 typename E_, typename F_, typename G_, typename H_, typename I_,
2298 typename J_, typename K_, typename L_
2300 struct result { typedef result_type type; };
2302 member_function_ptr_action(mem_func_ptr_t fptr_)
2305 template <typename CT>
2306 result_type operator()(CT& obj,
2307 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l
2310 return (impl::as_ptr<CT>::get(obj)->*fptr)
2311 (a, b, c, d, e, f, g, h, i, j, k, l);
2314 mem_func_ptr_t fptr;
2317 //////////////////////////////////
2318 template <typename RT, typename ClassT,
2319 typename A, typename B, typename C, typename D,
2320 typename E, typename F, typename G, typename H, typename I,
2321 typename J, typename K, typename L
2323 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
2324 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
2326 return member_function_ptr<
2327 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
2330 //////////////////////////////////
2331 template <typename RT, typename ClassT,
2332 typename A, typename B, typename C, typename D,
2333 typename E, typename F, typename G, typename H, typename I,
2334 typename J, typename K, typename L
2336 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
2337 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
2339 return member_function_ptr<
2340 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(fptr);
2343 ///////////////////////////////////////////////////////////////////////////////
2345 // Member function pointer binder (specialization for 13 args)
2347 ///////////////////////////////////////////////////////////////////////////////
2348 template <typename RT, typename ClassT,
2349 typename A, typename B, typename C, typename D,
2350 typename E, typename F, typename G, typename H, typename I,
2351 typename J, typename K, typename L, typename M
2353 struct member_function_ptr_action<RT, ClassT,
2354 A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
2356 typedef RT result_type;
2357 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M);
2358 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M) const;
2359 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2362 template <typename CT,
2363 typename A_, typename B_, typename C_, typename D_,
2364 typename E_, typename F_, typename G_, typename H_, typename I_,
2365 typename J_, typename K_, typename L_, typename M_
2367 struct result { typedef result_type type; };
2369 member_function_ptr_action(mem_func_ptr_t fptr_)
2372 template <typename CT>
2373 result_type operator()(CT& obj,
2374 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m
2377 return (impl::as_ptr<CT>::get(obj)->*fptr)
2378 (a, b, c, d, e, f, g, h, i, j, k, l, m);
2381 mem_func_ptr_t fptr;
2384 //////////////////////////////////
2385 template <typename RT, typename ClassT,
2386 typename A, typename B, typename C, typename D,
2387 typename E, typename F, typename G, typename H, typename I,
2388 typename J, typename K, typename L, typename M
2390 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
2391 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
2393 return member_function_ptr<
2394 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
2397 //////////////////////////////////
2398 template <typename RT, typename ClassT,
2399 typename A, typename B, typename C, typename D,
2400 typename E, typename F, typename G, typename H, typename I,
2401 typename J, typename K, typename L, typename M
2403 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
2404 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
2406 return member_function_ptr<
2407 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(fptr);
2410 ///////////////////////////////////////////////////////////////////////////////
2412 // Member function pointer binder (specialization for 14 args)
2414 ///////////////////////////////////////////////////////////////////////////////
2415 template <typename RT, typename ClassT,
2416 typename A, typename B, typename C, typename D,
2417 typename E, typename F, typename G, typename H, typename I,
2418 typename J, typename K, typename L, typename M, typename N
2420 struct member_function_ptr_action<RT, ClassT,
2421 A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
2423 typedef RT result_type;
2424 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
2425 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const;
2426 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2429 template <typename CT,
2430 typename A_, typename B_, typename C_, typename D_,
2431 typename E_, typename F_, typename G_, typename H_, typename I_,
2432 typename J_, typename K_, typename L_, typename M_, typename N_
2434 struct result { typedef result_type type; };
2436 member_function_ptr_action(mem_func_ptr_t fptr_)
2439 template <typename CT>
2440 result_type operator()(CT& obj,
2441 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n
2444 return (impl::as_ptr<CT>::get(obj)->*fptr)
2445 (a, b, c, d, e, f, g, h, i, j, k, l, m, n);
2448 mem_func_ptr_t fptr;
2451 //////////////////////////////////
2452 template <typename RT, typename ClassT,
2453 typename A, typename B, typename C, typename D,
2454 typename E, typename F, typename G, typename H, typename I,
2455 typename J, typename K, typename L, typename M, typename N
2457 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
2458 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
2460 return member_function_ptr<
2461 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
2464 //////////////////////////////////
2465 template <typename RT, typename ClassT,
2466 typename A, typename B, typename C, typename D,
2467 typename E, typename F, typename G, typename H, typename I,
2468 typename J, typename K, typename L, typename M, typename N
2470 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
2471 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
2473 return member_function_ptr<
2474 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(fptr);
2477 ///////////////////////////////////////////////////////////////////////////////
2479 // Member function pointer binder (specialization for 15 args)
2481 ///////////////////////////////////////////////////////////////////////////////
2482 template <typename RT, typename ClassT,
2483 typename A, typename B, typename C, typename D,
2484 typename E, typename F, typename G, typename H, typename I,
2485 typename J, typename K, typename L, typename M, typename N,
2488 struct member_function_ptr_action<RT, ClassT,
2489 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
2491 typedef RT result_type;
2492 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
2493 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const;
2494 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2497 template <typename CT,
2498 typename A_, typename B_, typename C_, typename D_,
2499 typename E_, typename F_, typename G_, typename H_, typename I_,
2500 typename J_, typename K_, typename L_, typename M_, typename N_,
2503 struct result { typedef result_type type; };
2505 member_function_ptr_action(mem_func_ptr_t fptr_)
2508 template <typename CT>
2509 result_type operator()(CT& obj,
2510 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n, O o
2513 return (impl::as_ptr<CT>::get(obj)->*fptr)
2514 (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
2517 mem_func_ptr_t fptr;
2520 //////////////////////////////////
2521 template <typename RT, typename ClassT,
2522 typename A, typename B, typename C, typename D,
2523 typename E, typename F, typename G, typename H, typename I,
2524 typename J, typename K, typename L, typename M, typename N,
2527 inline member_function_ptr<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
2528 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
2530 return member_function_ptr<
2531 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
2534 //////////////////////////////////
2535 template <typename RT, typename ClassT,
2536 typename A, typename B, typename C, typename D,
2537 typename E, typename F, typename G, typename H, typename I,
2538 typename J, typename K, typename L, typename M, typename N,
2541 inline member_function_ptr<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
2542 bind(RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
2544 return member_function_ptr<
2545 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(fptr);
2553 ///////////////////////////////////////////////////////////////////////////////
2555 // Bound member function binder (main class)
2557 ///////////////////////////////////////////////////////////////////////////////
2561 , typename A = nil_t
2562 , typename B = nil_t
2563 , typename C = nil_t
2565 #if PHOENIX_LIMIT > 3
2566 , typename D = nil_t
2567 , typename E = nil_t
2568 , typename F = nil_t
2570 #if PHOENIX_LIMIT > 6
2571 , typename G = nil_t
2572 , typename H = nil_t
2573 , typename I = nil_t
2575 #if PHOENIX_LIMIT > 9
2576 , typename J = nil_t
2577 , typename K = nil_t
2578 , typename L = nil_t
2580 #if PHOENIX_LIMIT > 12
2581 , typename M = nil_t
2582 , typename N = nil_t
2583 , typename O = nil_t
2590 , typename NU = nil_t // Not used
2592 struct bound_member_action;
2594 //////////////////////////////////
2598 , typename A = nil_t
2599 , typename B = nil_t
2600 , typename C = nil_t
2602 #if PHOENIX_LIMIT > 3
2603 , typename D = nil_t
2604 , typename E = nil_t
2605 , typename F = nil_t
2607 #if PHOENIX_LIMIT > 6
2608 , typename G = nil_t
2609 , typename H = nil_t
2610 , typename I = nil_t
2612 #if PHOENIX_LIMIT > 9
2613 , typename J = nil_t
2614 , typename K = nil_t
2615 , typename L = nil_t
2617 #if PHOENIX_LIMIT > 12
2618 , typename M = nil_t
2619 , typename N = nil_t
2620 , typename O = nil_t
2628 : public function<bound_member_action<RT, ClassT
2630 #if PHOENIX_LIMIT > 3
2632 #if PHOENIX_LIMIT > 6
2634 #if PHOENIX_LIMIT > 9
2636 #if PHOENIX_LIMIT > 12
2644 typedef bound_member_action<RT, ClassT
2646 #if PHOENIX_LIMIT > 3
2648 #if PHOENIX_LIMIT > 6
2650 #if PHOENIX_LIMIT > 9
2652 #if PHOENIX_LIMIT > 12
2660 template <typename CT, typename FPT>
2661 bound_member(CT & c, FPT fp)
2662 : function<action_t>(action_t(c,fp)) {}
2664 #if !defined(__BORLANDC__)
2665 template <typename CT, typename FPT>
2666 bound_member(CT * c, FPT fp)
2667 : function<action_t>(action_t(c,fp)) {}
2671 ///////////////////////////////////////////////////////////////////////////////
2673 // Bound member function binder (specialization for 0 arg)
2675 ///////////////////////////////////////////////////////////////////////////////
2677 template <typename RT, typename ClassT>
2678 struct bound_member_action<RT, ClassT,
2679 nil_t, nil_t, nil_t,
2680 #if PHOENIX_LIMIT > 3
2681 nil_t, nil_t, nil_t,
2682 #if PHOENIX_LIMIT > 6
2683 nil_t, nil_t, nil_t,
2684 #if PHOENIX_LIMIT > 9
2685 nil_t, nil_t, nil_t,
2686 #if PHOENIX_LIMIT > 12
2687 nil_t, nil_t, nil_t,
2695 typedef RT result_type;
2696 typedef RT(ClassT::*mf)();
2697 typedef RT(ClassT::*cmf)() const;
2698 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2701 template <typename CT>
2702 struct result { typedef result_type type; };
2704 template <typename CT>
2705 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
2706 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
2708 result_type operator()() const
2709 { return (obj->*fptr)(); }
2711 typename impl::as_ptr<ClassT>::pointer_type obj;
2712 mem_func_ptr_t fptr;
2715 //////////////////////////////////
2717 template <typename RT, typename ClassT>
2718 inline bound_member<RT,ClassT>
2719 bind(ClassT & obj, RT(ClassT::*fptr)())
2721 return bound_member<RT,ClassT>(obj, fptr);
2724 template <typename RT, typename ClassT>
2725 inline bound_member<RT,ClassT>
2726 bind(ClassT * obj, RT(ClassT::*fptr)())
2728 #if defined(__MWERKS__) && (__MWERKS__ < 0x3003)
2729 return bound_member<RT,ClassT>(*obj, fptr);
2731 return bound_member<RT,ClassT>(obj, fptr);
2735 template <typename RT, typename ClassT>
2736 inline bound_member<RT,ClassT const>
2737 bind(ClassT const& obj, RT(ClassT::*fptr)())
2739 return bound_member<RT,ClassT const>(obj, fptr);
2742 template <typename RT, typename ClassT>
2743 inline bound_member<RT,ClassT const>
2744 bind(ClassT const* obj, RT(ClassT::*fptr)() const)
2746 #if defined(__MWERKS__) && (__MWERKS__ < 0x3003)
2747 return bound_member<RT,ClassT const>(*obj, fptr);
2749 return bound_member<RT,ClassT const>(obj, fptr);
2753 ///////////////////////////////////////////////////////////////////////////////
2755 // Bound member function binder (specialization for 1 arg)
2757 ///////////////////////////////////////////////////////////////////////////////
2758 template <typename RT, typename ClassT, typename A>
2759 struct bound_member_action<RT, ClassT,
2761 #if PHOENIX_LIMIT > 3
2762 nil_t, nil_t, nil_t,
2763 #if PHOENIX_LIMIT > 6
2764 nil_t, nil_t, nil_t,
2765 #if PHOENIX_LIMIT > 9
2766 nil_t, nil_t, nil_t,
2767 #if PHOENIX_LIMIT > 12
2768 nil_t, nil_t, nil_t,
2776 typedef RT result_type;
2777 typedef RT(ClassT::*mf)(A);
2778 typedef RT(ClassT::*cmf)(A) const;
2779 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2782 template <typename A_>
2783 struct result { typedef result_type type; };
2785 template <typename CT>
2786 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
2787 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
2789 result_type operator()(A a) const
2790 { return (obj->*fptr)(a); }
2792 typename impl::as_ptr<ClassT>::pointer_type obj;
2793 mem_func_ptr_t fptr;
2796 //////////////////////////////////
2797 template <typename RT, typename ClassT, typename A>
2798 inline bound_member<RT, ClassT, A>
2799 bind(ClassT & obj, RT(ClassT::*fptr)(A))
2801 return bound_member<RT, ClassT, A>(obj,fptr);
2804 template <typename RT, typename ClassT, typename A>
2805 inline bound_member<RT, ClassT, A>
2806 bind(ClassT * obj, RT(ClassT::*fptr)(A))
2808 return bound_member<RT, ClassT, A>(obj,fptr);
2811 //////////////////////////////////
2812 template <typename RT, typename ClassT, typename A>
2813 inline bound_member<RT, ClassT const, A>
2814 bind(ClassT const& obj, RT(ClassT::*fptr)(A) const)
2816 return bound_member<RT, ClassT const, A>(obj,fptr);
2819 template <typename RT, typename ClassT, typename A>
2820 inline bound_member<RT, ClassT const, A>
2821 bind(ClassT const* obj, RT(ClassT::*fptr)(A) const)
2823 return bound_member<RT, ClassT const, A>(obj,fptr);
2826 ///////////////////////////////////////////////////////////////////////////////
2828 // Bound member function binder (specialization for 2 args)
2830 ///////////////////////////////////////////////////////////////////////////////
2831 template <typename RT, typename ClassT, typename A, typename B>
2832 struct bound_member_action<RT, ClassT,
2834 #if PHOENIX_LIMIT > 3
2835 nil_t, nil_t, nil_t,
2836 #if PHOENIX_LIMIT > 6
2837 nil_t, nil_t, nil_t,
2838 #if PHOENIX_LIMIT > 9
2839 nil_t, nil_t, nil_t,
2840 #if PHOENIX_LIMIT > 12
2841 nil_t, nil_t, nil_t,
2849 typedef RT result_type;
2850 typedef RT(ClassT::*mf)(A, B);
2851 typedef RT(ClassT::*cmf)(A, B) const;
2852 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2855 template <typename A_, typename B_>
2856 struct result { typedef result_type type; };
2858 template <typename CT>
2859 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
2860 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
2862 result_type operator()(A a, B b) const
2863 { return (obj->*fptr)(a, b); }
2865 typename impl::as_ptr<ClassT>::pointer_type obj;
2866 mem_func_ptr_t fptr;
2869 //////////////////////////////////
2870 template <typename RT, typename ClassT, typename A, typename B>
2871 inline bound_member<RT, ClassT, A, B>
2872 bind(ClassT & obj,RT(ClassT::*fptr)(A, B))
2874 return bound_member<RT, ClassT, A, B>(obj,fptr);
2877 template <typename RT, typename ClassT, typename A, typename B>
2878 inline bound_member<RT, ClassT, A, B>
2879 bind(ClassT * obj,RT(ClassT::*fptr)(A, B))
2881 return bound_member<RT, ClassT, A, B>(obj,fptr);
2884 template <typename RT, typename ClassT, typename A, typename B>
2885 inline bound_member<RT, ClassT const, A, B>
2886 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B) const)
2888 return bound_member<RT, ClassT const, A, B>(obj,fptr);
2891 template <typename RT, typename ClassT, typename A, typename B>
2892 inline bound_member<RT, ClassT const, A, B>
2893 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B) const)
2895 return bound_member<RT, ClassT const, A, B>(obj,fptr);
2898 #if PHOENIX_LIMIT > 3
2899 ///////////////////////////////////////////////////////////////////////////////
2901 // Bound member function binder (specialization for 3 args)
2903 ///////////////////////////////////////////////////////////////////////////////
2904 template <typename RT, typename ClassT, typename A, typename B, typename C>
2905 struct bound_member_action<RT, ClassT,
2906 A, B, C, nil_t, nil_t, nil_t,
2907 #if PHOENIX_LIMIT > 6
2908 nil_t, nil_t, nil_t,
2909 #if PHOENIX_LIMIT > 9
2910 nil_t, nil_t, nil_t,
2911 #if PHOENIX_LIMIT > 12
2912 nil_t, nil_t, nil_t,
2919 typedef RT result_type;
2920 typedef RT(ClassT::*mf)(A, B, C);
2921 typedef RT(ClassT::*cmf)(A, B, C) const;
2922 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2925 template <typename A_, typename B_, typename C_>
2926 struct result { typedef result_type type; };
2928 template <typename CT>
2929 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
2930 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
2932 result_type operator()(A a, B b, C c) const
2933 { return (obj->*fptr)(a, b, c); }
2935 typename impl::as_ptr<ClassT>::pointer_type obj;
2936 mem_func_ptr_t fptr;
2939 //////////////////////////////////
2940 template <typename RT, typename ClassT, typename A, typename B, typename C>
2941 inline bound_member<RT, ClassT, A, B, C>
2942 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C))
2944 return bound_member<RT, ClassT, A, B, C>(obj,fptr);
2947 template <typename RT, typename ClassT, typename A, typename B, typename C>
2948 inline bound_member<RT, ClassT, A, B, C>
2949 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C))
2951 return bound_member<RT, ClassT, A, B, C>(obj,fptr);
2954 template <typename RT, typename ClassT, typename A, typename B, typename C>
2955 inline bound_member<RT, ClassT const, A, B, C>
2956 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C) const)
2958 return bound_member<RT, ClassT const, A, B, C>(obj,fptr);
2961 template <typename RT, typename ClassT, typename A, typename B, typename C>
2962 inline bound_member<RT, ClassT const, A, B, C>
2963 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C) const)
2965 return bound_member<RT, ClassT const, A, B, C>(obj,fptr);
2968 ///////////////////////////////////////////////////////////////////////////////
2970 // Bound member function binder (specialization for 4 args)
2972 ///////////////////////////////////////////////////////////////////////////////
2973 template <typename RT, typename ClassT,
2974 typename A, typename B, typename C, typename D
2976 struct bound_member_action<RT, ClassT,
2977 A, B, C, D, nil_t, nil_t,
2978 #if PHOENIX_LIMIT > 6
2979 nil_t, nil_t, nil_t,
2980 #if PHOENIX_LIMIT > 9
2981 nil_t, nil_t, nil_t,
2982 #if PHOENIX_LIMIT > 12
2983 nil_t, nil_t, nil_t,
2990 typedef RT result_type;
2991 typedef RT(ClassT::*mf)(A, B, C, D);
2992 typedef RT(ClassT::*cmf)(A, B, C, D) const;
2993 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
2996 template <typename A_, typename B_, typename C_, typename D_>
2997 struct result { typedef result_type type; };
2999 template <typename CT>
3000 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3001 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3003 result_type operator()(A a, B b, C c, D d) const
3004 { return (obj->*fptr)(a, b, c, d); }
3006 typename impl::as_ptr<ClassT>::pointer_type obj;
3007 mem_func_ptr_t fptr;
3010 //////////////////////////////////
3011 template <typename RT, typename ClassT,
3012 typename A, typename B, typename C, typename D
3014 inline bound_member<RT, ClassT, A, B, C, D>
3015 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D))
3017 return bound_member<
3018 RT, ClassT, A, B, C, D>(obj,fptr);
3021 template <typename RT, typename ClassT,
3022 typename A, typename B, typename C, typename D
3024 inline bound_member<RT, ClassT, A, B, C, D>
3025 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D))
3027 return bound_member<
3028 RT, ClassT, A, B, C, D>(obj,fptr);
3031 template <typename RT, typename ClassT,
3032 typename A, typename B, typename C, typename D
3034 inline bound_member<RT, ClassT const, A, B, C, D>
3035 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D) const)
3037 return bound_member<
3038 RT, ClassT const, A, B, C, D>(obj,fptr);
3041 template <typename RT, typename ClassT,
3042 typename A, typename B, typename C, typename D
3044 inline bound_member<RT, ClassT const, A, B, C, D>
3045 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D) const)
3047 return bound_member<
3048 RT, ClassT const, A, B, C, D>(obj,fptr);
3051 ///////////////////////////////////////////////////////////////////////////////
3053 // Bound member function binder (specialization for 5 args)
3055 ///////////////////////////////////////////////////////////////////////////////
3056 template <typename RT, typename ClassT,
3057 typename A, typename B, typename C, typename D,
3060 struct bound_member_action<RT, ClassT,
3061 A, B, C, D, E, nil_t,
3062 #if PHOENIX_LIMIT > 6
3063 nil_t, nil_t, nil_t,
3064 #if PHOENIX_LIMIT > 9
3065 nil_t, nil_t, nil_t,
3066 #if PHOENIX_LIMIT > 12
3067 nil_t, nil_t, nil_t,
3074 typedef RT result_type;
3075 typedef RT(ClassT::*mf)(A, B, C, D, E);
3076 typedef RT(ClassT::*cmf)(A, B, C, D, E) const;
3077 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3080 template <typename A_, typename B_, typename C_, typename D_,
3083 struct result { typedef result_type type; };
3085 template <typename CT>
3086 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3087 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3089 result_type operator()(
3090 A a, B b, C c, D d, E e
3092 { return (obj->*fptr)(a, b, c, d, e); }
3094 typename impl::as_ptr<ClassT>::pointer_type obj;
3095 mem_func_ptr_t fptr;
3098 //////////////////////////////////
3099 template <typename RT, typename ClassT,
3100 typename A, typename B, typename C, typename D,
3103 inline bound_member<RT, ClassT, A, B, C, D, E>
3104 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E))
3106 return bound_member<
3107 RT, ClassT, A, B, C, D, E>(obj,fptr);
3110 template <typename RT, typename ClassT,
3111 typename A, typename B, typename C, typename D,
3114 inline bound_member<RT, ClassT, A, B, C, D, E>
3115 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E))
3117 return bound_member<
3118 RT, ClassT, A, B, C, D, E>(obj,fptr);
3121 template <typename RT, typename ClassT,
3122 typename A, typename B, typename C, typename D,
3125 inline bound_member<RT, ClassT const, A, B, C, D, E>
3126 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E) const)
3128 return bound_member<
3129 RT, ClassT const, A, B, C, D, E>(obj,fptr);
3132 template <typename RT, typename ClassT,
3133 typename A, typename B, typename C, typename D,
3136 inline bound_member<RT, ClassT const, A, B, C, D, E>
3137 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E) const)
3139 return bound_member<
3140 RT, ClassT const, A, B, C, D, E>(obj,fptr);
3143 #if PHOENIX_LIMIT > 6
3144 ///////////////////////////////////////////////////////////////////////////////
3146 // Bound member function binder (specialization for 6 args)
3148 ///////////////////////////////////////////////////////////////////////////////
3149 template <typename RT, typename ClassT,
3150 typename A, typename B, typename C, typename D,
3151 typename E, typename F
3153 struct bound_member_action<RT, ClassT,
3154 A, B, C, D, E, F, nil_t, nil_t, nil_t,
3155 #if PHOENIX_LIMIT > 9
3156 nil_t, nil_t, nil_t,
3157 #if PHOENIX_LIMIT > 12
3158 nil_t, nil_t, nil_t,
3164 typedef RT result_type;
3165 typedef RT(ClassT::*mf)(A, B, C, D, E, F);
3166 typedef RT(ClassT::*cmf)(A, B, C, D, E, F) const;
3167 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3171 typename A_, typename B_, typename C_, typename D_,
3172 typename E_, typename F_
3174 struct result { typedef result_type type; };
3176 template <typename CT>
3177 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3178 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3180 result_type operator()(
3181 A a, B b, C c, D d, E e, F f
3183 { return (obj->*fptr)(a, b, c, d, e, f); }
3185 typename impl::as_ptr<ClassT>::pointer_type obj;
3186 mem_func_ptr_t fptr;
3189 //////////////////////////////////
3190 template <typename RT, typename ClassT,
3191 typename A, typename B, typename C, typename D,
3192 typename E, typename F
3194 inline bound_member<RT, ClassT, A, B, C, D, E, F>
3195 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F))
3197 return bound_member<
3198 RT, ClassT, A, B, C, D, E, F>(obj,fptr);
3201 template <typename RT, typename ClassT,
3202 typename A, typename B, typename C, typename D,
3203 typename E, typename F
3205 inline bound_member<RT, ClassT, A, B, C, D, E, F>
3206 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F))
3208 return bound_member<
3209 RT, ClassT, A, B, C, D, E, F>(obj,fptr);
3212 template <typename RT, typename ClassT,
3213 typename A, typename B, typename C, typename D,
3214 typename E, typename F
3216 inline bound_member<RT, ClassT const, A, B, C, D, E, F>
3217 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F) const)
3219 return bound_member<
3220 RT, ClassT const, A, B, C, D, E, F>(obj,fptr);
3223 template <typename RT, typename ClassT,
3224 typename A, typename B, typename C, typename D,
3225 typename E, typename F
3227 inline bound_member<RT, ClassT const, A, B, C, D, E, F>
3228 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F) const)
3230 return bound_member<
3231 RT, ClassT const, A, B, C, D, E, F>(obj,fptr);
3234 ///////////////////////////////////////////////////////////////////////////////
3236 // Bound member function binder (specialization for 7 args)
3238 ///////////////////////////////////////////////////////////////////////////////
3239 template <typename RT, typename ClassT,
3240 typename A, typename B, typename C, typename D,
3241 typename E, typename F, typename G
3243 struct bound_member_action<RT, ClassT,
3244 A, B, C, D, E, F, G, nil_t, nil_t,
3245 #if PHOENIX_LIMIT > 9
3246 nil_t, nil_t, nil_t,
3247 #if PHOENIX_LIMIT > 12
3248 nil_t, nil_t, nil_t,
3254 typedef RT result_type;
3255 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G);
3256 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G) const;
3257 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3261 typename A_, typename B_, typename C_, typename D_,
3262 typename E_, typename F_, typename G_
3264 struct result { typedef result_type type; };
3266 template <typename CT>
3267 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3268 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3270 result_type operator()(
3271 A a, B b, C c, D d, E e, F f, G g
3273 { return (obj->*fptr)(a, b, c, d, e, f, g); }
3275 typename impl::as_ptr<ClassT>::pointer_type obj;
3276 mem_func_ptr_t fptr;
3279 //////////////////////////////////
3280 template <typename RT, typename ClassT,
3281 typename A, typename B, typename C, typename D,
3282 typename E, typename F, typename G
3284 inline bound_member<RT, ClassT, A, B, C, D, E, F, G>
3285 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G))
3287 return bound_member<
3288 RT, ClassT, A, B, C, D, E, F, G>(obj,fptr);
3291 template <typename RT, typename ClassT,
3292 typename A, typename B, typename C, typename D,
3293 typename E, typename F, typename G
3295 inline bound_member<RT, ClassT, A, B, C, D, E, F, G>
3296 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G))
3298 return bound_member<
3299 RT, ClassT, A, B, C, D, E, F, G>(obj,fptr);
3302 template <typename RT, typename ClassT,
3303 typename A, typename B, typename C, typename D,
3304 typename E, typename F, typename G
3306 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G>
3307 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
3309 return bound_member<
3310 RT, ClassT const, A, B, C, D, E, F, G>(obj,fptr);
3313 template <typename RT, typename ClassT,
3314 typename A, typename B, typename C, typename D,
3315 typename E, typename F, typename G
3317 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G>
3318 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G) const)
3320 return bound_member<
3321 RT, ClassT const, A, B, C, D, E, F, G>(obj,fptr);
3324 ///////////////////////////////////////////////////////////////////////////////
3326 // Bound member function binder (specialization for 8 args)
3328 ///////////////////////////////////////////////////////////////////////////////
3329 template <typename RT, typename ClassT,
3330 typename A, typename B, typename C, typename D,
3331 typename E, typename F, typename G, typename H
3333 struct bound_member_action<RT, ClassT,
3334 A, B, C, D, E, F, G, H, nil_t,
3335 #if PHOENIX_LIMIT > 9
3336 nil_t, nil_t, nil_t,
3337 #if PHOENIX_LIMIT > 12
3338 nil_t, nil_t, nil_t,
3344 typedef RT result_type;
3345 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H);
3346 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H) const;
3347 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3351 typename A_, typename B_, typename C_, typename D_,
3352 typename E_, typename F_, typename G_, typename H_
3354 struct result { typedef result_type type; };
3356 template <typename CT>
3357 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3358 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3360 result_type operator()(
3361 A a, B b, C c, D d, E e, F f, G g, H h
3363 { return (obj->*fptr)(a, b, c, d, e, f, g, h); }
3365 typename impl::as_ptr<ClassT>::pointer_type obj;
3366 mem_func_ptr_t fptr;
3369 //////////////////////////////////
3370 template <typename RT, typename ClassT,
3371 typename A, typename B, typename C, typename D,
3372 typename E, typename F, typename G, typename H
3374 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H>
3375 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
3377 return bound_member<
3378 RT, ClassT, A, B, C, D, E, F, G, H>(obj,fptr);
3381 template <typename RT, typename ClassT,
3382 typename A, typename B, typename C, typename D,
3383 typename E, typename F, typename G, typename H
3385 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H>
3386 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H))
3388 return bound_member<
3389 RT, ClassT, A, B, C, D, E, F, G, H>(obj,fptr);
3392 template <typename RT, typename ClassT,
3393 typename A, typename B, typename C, typename D,
3394 typename E, typename F, typename G, typename H
3396 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H>
3397 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
3399 return bound_member<
3400 RT, ClassT const, A, B, C, D, E, F, G, H>(obj,fptr);
3403 template <typename RT, typename ClassT,
3404 typename A, typename B, typename C, typename D,
3405 typename E, typename F, typename G, typename H
3407 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H>
3408 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H) const)
3410 return bound_member<
3411 RT, ClassT const, A, B, C, D, E, F, G, H>(obj,fptr);
3414 #if PHOENIX_LIMIT > 9
3415 ///////////////////////////////////////////////////////////////////////////////
3417 // Bound member function binder (specialization for 9 args)
3419 ///////////////////////////////////////////////////////////////////////////////
3420 template <typename RT, typename ClassT,
3421 typename A, typename B, typename C, typename D,
3422 typename E, typename F, typename G, typename H, typename I
3424 struct bound_member_action<RT, ClassT,
3425 A, B, C, D, E, F, G, H, I, nil_t, nil_t, nil_t,
3426 #if PHOENIX_LIMIT > 12
3427 nil_t, nil_t, nil_t,
3432 typedef RT result_type;
3433 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I);
3434 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I) const;
3435 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3439 typename A_, typename B_, typename C_, typename D_,
3440 typename E_, typename F_, typename G_, typename H_, typename I_
3442 struct result { typedef result_type type; };
3444 template <typename CT>
3445 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3446 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3448 result_type operator()(
3449 A a, B b, C c, D d, E e, F f, G g, H h, I i
3451 { return (obj->*fptr)(a, b, c, d, e, f, g, h, i); }
3453 typename impl::as_ptr<ClassT>::pointer_type obj;
3454 mem_func_ptr_t fptr;
3457 //////////////////////////////////
3458 template <typename RT, typename ClassT,
3459 typename A, typename B, typename C, typename D,
3460 typename E, typename F, typename G, typename H, typename I
3462 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I>
3463 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
3465 return bound_member<
3466 RT, ClassT, A, B, C, D, E, F, G, H, I>(obj,fptr);
3469 template <typename RT, typename ClassT,
3470 typename A, typename B, typename C, typename D,
3471 typename E, typename F, typename G, typename H, typename I
3473 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I>
3474 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I))
3476 return bound_member<
3477 RT, ClassT, A, B, C, D, E, F, G, H, I>(obj,fptr);
3480 template <typename RT, typename ClassT,
3481 typename A, typename B, typename C, typename D,
3482 typename E, typename F, typename G, typename H, typename I
3484 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I>
3485 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
3487 return bound_member<
3488 RT, ClassT const, A, B, C, D, E, F, G, H, I>(obj,fptr);
3491 template <typename RT, typename ClassT,
3492 typename A, typename B, typename C, typename D,
3493 typename E, typename F, typename G, typename H, typename I
3495 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I>
3496 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I) const)
3498 return bound_member<
3499 RT, ClassT const, A, B, C, D, E, F, G, H, I>(obj,fptr);
3502 ///////////////////////////////////////////////////////////////////////////////
3504 // Bound member function binder (specialization for 10 args)
3506 ///////////////////////////////////////////////////////////////////////////////
3507 template <typename RT, typename ClassT,
3508 typename A, typename B, typename C, typename D,
3509 typename E, typename F, typename G, typename H, typename I,
3512 struct bound_member_action<RT, ClassT,
3513 A, B, C, D, E, F, G, H, I, J, nil_t, nil_t,
3514 #if PHOENIX_LIMIT > 12
3515 nil_t, nil_t, nil_t,
3520 typedef RT result_type;
3521 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J);
3522 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J) const;
3523 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3527 typename A_, typename B_, typename C_, typename D_,
3528 typename E_, typename F_, typename G_, typename H_, typename I_,
3531 struct result { typedef result_type type; };
3533 template <typename CT>
3534 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3535 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3537 result_type operator()(
3538 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j
3541 return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j);
3544 typename impl::as_ptr<ClassT>::pointer_type obj;
3545 mem_func_ptr_t fptr;
3548 //////////////////////////////////
3549 template <typename RT, typename ClassT,
3550 typename A, typename B, typename C, typename D,
3551 typename E, typename F, typename G, typename H, typename I,
3554 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
3555 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
3557 return bound_member<
3558 RT, ClassT, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
3561 template <typename RT, typename ClassT,
3562 typename A, typename B, typename C, typename D,
3563 typename E, typename F, typename G, typename H, typename I,
3566 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J>
3567 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J))
3569 return bound_member<
3570 RT, ClassT, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
3573 template <typename RT, typename ClassT,
3574 typename A, typename B, typename C, typename D,
3575 typename E, typename F, typename G, typename H, typename I,
3578 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
3579 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
3581 return bound_member<
3582 RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
3585 template <typename RT, typename ClassT,
3586 typename A, typename B, typename C, typename D,
3587 typename E, typename F, typename G, typename H, typename I,
3590 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J>
3591 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J) const)
3593 return bound_member<
3594 RT, ClassT const, A, B, C, D, E, F, G, H, I, J>(obj,fptr);
3597 ///////////////////////////////////////////////////////////////////////////////
3599 // Bound member function binder (specialization for 11 args)
3601 ///////////////////////////////////////////////////////////////////////////////
3602 template <typename RT, typename ClassT,
3603 typename A, typename B, typename C, typename D,
3604 typename E, typename F, typename G, typename H, typename I,
3605 typename J, typename K
3607 struct bound_member_action<RT, ClassT,
3608 A, B, C, D, E, F, G, H, I, J, K, nil_t,
3609 #if PHOENIX_LIMIT > 12
3610 nil_t, nil_t, nil_t,
3615 typedef RT result_type;
3616 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K);
3617 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K) const;
3618 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3622 typename A_, typename B_, typename C_, typename D_,
3623 typename E_, typename F_, typename G_, typename H_, typename I_,
3624 typename J_, typename K_
3626 struct result { typedef result_type type; };
3628 template <typename CT>
3629 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3630 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3632 result_type operator()(
3633 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k
3636 return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k);
3639 typename impl::as_ptr<ClassT>::pointer_type obj;
3640 mem_func_ptr_t fptr;
3643 //////////////////////////////////
3644 template <typename RT, typename ClassT,
3645 typename A, typename B, typename C, typename D,
3646 typename E, typename F, typename G, typename H, typename I,
3647 typename J, typename K
3649 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
3650 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
3652 return bound_member<
3653 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
3656 template <typename RT, typename ClassT,
3657 typename A, typename B, typename C, typename D,
3658 typename E, typename F, typename G, typename H, typename I,
3659 typename J, typename K
3661 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>
3662 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K))
3664 return bound_member<
3665 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
3668 template <typename RT, typename ClassT,
3669 typename A, typename B, typename C, typename D,
3670 typename E, typename F, typename G, typename H, typename I,
3671 typename J, typename K
3673 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
3674 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
3676 return bound_member<
3677 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
3680 template <typename RT, typename ClassT,
3681 typename A, typename B, typename C, typename D,
3682 typename E, typename F, typename G, typename H, typename I,
3683 typename J, typename K
3685 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>
3686 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K) const)
3688 return bound_member<
3689 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K>(obj,fptr);
3692 #if PHOENIX_LIMIT > 12
3693 ///////////////////////////////////////////////////////////////////////////////
3695 // Bound member function binder (specialization for 12 args)
3697 ///////////////////////////////////////////////////////////////////////////////
3698 template <typename RT, typename ClassT,
3699 typename A, typename B, typename C, typename D,
3700 typename E, typename F, typename G, typename H, typename I,
3701 typename J, typename K, typename L
3703 struct bound_member_action<RT, ClassT,
3704 A, B, C, D, E, F, G, H, I, J, K, L, nil_t, nil_t, nil_t, nil_t> {
3706 typedef RT result_type;
3707 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L);
3708 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L) const;
3709 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3713 typename A_, typename B_, typename C_, typename D_,
3714 typename E_, typename F_, typename G_, typename H_, typename I_,
3715 typename J_, typename K_, typename L_
3717 struct result { typedef result_type type; };
3719 template <typename CT>
3720 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3721 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3723 result_type operator()(
3724 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l
3727 return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l);
3730 typename impl::as_ptr<ClassT>::pointer_type obj;
3731 mem_func_ptr_t fptr;
3734 //////////////////////////////////
3735 template <typename RT, typename ClassT,
3736 typename A, typename B, typename C, typename D,
3737 typename E, typename F, typename G, typename H, typename I,
3738 typename J, typename K, typename L
3740 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
3741 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
3743 return bound_member<
3744 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
3747 template <typename RT, typename ClassT,
3748 typename A, typename B, typename C, typename D,
3749 typename E, typename F, typename G, typename H, typename I,
3750 typename J, typename K, typename L
3752 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>
3753 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L))
3755 return bound_member<
3756 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
3759 template <typename RT, typename ClassT,
3760 typename A, typename B, typename C, typename D,
3761 typename E, typename F, typename G, typename H, typename I,
3762 typename J, typename K, typename L
3764 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
3765 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
3767 return bound_member<
3768 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
3771 template <typename RT, typename ClassT,
3772 typename A, typename B, typename C, typename D,
3773 typename E, typename F, typename G, typename H, typename I,
3774 typename J, typename K, typename L
3776 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>
3777 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L) const)
3779 return bound_member<
3780 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L>(obj,fptr);
3783 ///////////////////////////////////////////////////////////////////////////////
3785 // Bound member function binder (specialization for 13 args)
3787 ///////////////////////////////////////////////////////////////////////////////
3788 template <typename RT, typename ClassT,
3789 typename A, typename B, typename C, typename D,
3790 typename E, typename F, typename G, typename H, typename I,
3791 typename J, typename K, typename L, typename M
3793 struct bound_member_action<RT, ClassT,
3794 A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> {
3796 typedef RT result_type;
3797 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M);
3798 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M) const;
3799 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3803 typename A_, typename B_, typename C_, typename D_,
3804 typename E_, typename F_, typename G_, typename H_, typename I_,
3805 typename J_, typename K_, typename L_, typename M_
3807 struct result { typedef result_type type; };
3809 template <typename CT>
3810 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3811 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3813 result_type operator()(
3814 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m
3817 return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m);
3820 typename impl::as_ptr<ClassT>::pointer_type obj;
3821 mem_func_ptr_t fptr;
3824 //////////////////////////////////
3825 template <typename RT, typename ClassT,
3826 typename A, typename B, typename C, typename D,
3827 typename E, typename F, typename G, typename H, typename I,
3828 typename J, typename K, typename L, typename M
3830 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
3831 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
3833 return bound_member<
3834 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
3837 template <typename RT, typename ClassT,
3838 typename A, typename B, typename C, typename D,
3839 typename E, typename F, typename G, typename H, typename I,
3840 typename J, typename K, typename L, typename M
3842 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>
3843 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M))
3845 return bound_member<
3846 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
3849 template <typename RT, typename ClassT,
3850 typename A, typename B, typename C, typename D,
3851 typename E, typename F, typename G, typename H, typename I,
3852 typename J, typename K, typename L, typename M
3854 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
3855 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
3857 return bound_member<
3858 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
3861 template <typename RT, typename ClassT,
3862 typename A, typename B, typename C, typename D,
3863 typename E, typename F, typename G, typename H, typename I,
3864 typename J, typename K, typename L, typename M
3866 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>
3867 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M) const)
3869 return bound_member<
3870 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M>(obj,fptr);
3873 ///////////////////////////////////////////////////////////////////////////////
3875 // Bound member function binder (specialization for 14 args)
3877 ///////////////////////////////////////////////////////////////////////////////
3878 template <typename RT, typename ClassT,
3879 typename A, typename B, typename C, typename D,
3880 typename E, typename F, typename G, typename H, typename I,
3881 typename J, typename K, typename L, typename M, typename N
3883 struct bound_member_action<RT, ClassT,
3884 A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> {
3886 typedef RT result_type;
3887 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
3888 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const;
3889 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3893 typename A_, typename B_, typename C_, typename D_,
3894 typename E_, typename F_, typename G_, typename H_, typename I_,
3895 typename J_, typename K_, typename L_, typename M_, typename N_
3897 struct result { typedef result_type type; };
3899 template <typename CT>
3900 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3901 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3903 result_type operator()(
3904 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n
3907 return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
3910 typename impl::as_ptr<ClassT>::pointer_type obj;
3911 mem_func_ptr_t fptr;
3914 //////////////////////////////////
3915 template <typename RT, typename ClassT,
3916 typename A, typename B, typename C, typename D,
3917 typename E, typename F, typename G, typename H, typename I,
3918 typename J, typename K, typename L, typename M, typename N
3920 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
3921 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
3923 return bound_member<
3924 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
3927 template <typename RT, typename ClassT,
3928 typename A, typename B, typename C, typename D,
3929 typename E, typename F, typename G, typename H, typename I,
3930 typename J, typename K, typename L, typename M, typename N
3932 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
3933 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N))
3935 return bound_member<
3936 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
3939 template <typename RT, typename ClassT,
3940 typename A, typename B, typename C, typename D,
3941 typename E, typename F, typename G, typename H, typename I,
3942 typename J, typename K, typename L, typename M, typename N
3944 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
3945 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
3947 return bound_member<
3948 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
3951 template <typename RT, typename ClassT,
3952 typename A, typename B, typename C, typename D,
3953 typename E, typename F, typename G, typename H, typename I,
3954 typename J, typename K, typename L, typename M, typename N
3956 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>
3957 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N) const)
3959 return bound_member<
3960 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N>(obj,fptr);
3963 ///////////////////////////////////////////////////////////////////////////////
3965 // Bound member function binder (specialization for 15 args)
3967 ///////////////////////////////////////////////////////////////////////////////
3968 template <typename RT, typename ClassT,
3969 typename A, typename B, typename C, typename D,
3970 typename E, typename F, typename G, typename H, typename I,
3971 typename J, typename K, typename L, typename M, typename N,
3974 struct bound_member_action<RT, ClassT,
3975 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> {
3977 typedef RT result_type;
3978 typedef RT(ClassT::*mf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
3979 typedef RT(ClassT::*cmf)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const;
3980 typedef typename boost::mpl::if_<boost::is_const<ClassT>, cmf, mf>::type
3984 typename A_, typename B_, typename C_, typename D_,
3985 typename E_, typename F_, typename G_, typename H_, typename I_,
3986 typename J_, typename K_, typename L_, typename M_, typename N_,
3989 struct result { typedef result_type type; };
3991 template <typename CT>
3992 bound_member_action(CT & obj_, mem_func_ptr_t fptr_)
3993 : obj(impl::as_ptr<CT>::get(obj_)), fptr(fptr_) {}
3995 result_type operator()(
3996 A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l, M m, N n, O o
3999 return (obj->*fptr)(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
4002 typename impl::as_ptr<ClassT>::pointer_type obj;
4003 mem_func_ptr_t fptr;
4006 //////////////////////////////////
4007 template <typename RT, typename ClassT,
4008 typename A, typename B, typename C, typename D,
4009 typename E, typename F, typename G, typename H, typename I,
4010 typename J, typename K, typename L, typename M, typename N,
4013 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
4014 bind(ClassT & obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
4016 return bound_member<
4017 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
4020 template <typename RT, typename ClassT,
4021 typename A, typename B, typename C, typename D,
4022 typename E, typename F, typename G, typename H, typename I,
4023 typename J, typename K, typename L, typename M, typename N,
4026 inline bound_member<RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
4027 bind(ClassT * obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O))
4029 return bound_member<
4030 RT, ClassT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
4033 template <typename RT, typename ClassT,
4034 typename A, typename B, typename C, typename D,
4035 typename E, typename F, typename G, typename H, typename I,
4036 typename J, typename K, typename L, typename M, typename N,
4039 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
4040 bind(ClassT const& obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
4042 return bound_member<
4043 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
4046 template <typename RT, typename ClassT,
4047 typename A, typename B, typename C, typename D,
4048 typename E, typename F, typename G, typename H, typename I,
4049 typename J, typename K, typename L, typename M, typename N,
4052 inline bound_member<RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>
4053 bind(ClassT const* obj,RT(ClassT::*fptr)(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) const)
4055 return bound_member<
4056 RT, ClassT const, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(obj,fptr);
4064 } // namespace phoenix