1 // FastDelegateBind.h
\r
2 // Helper file for FastDelegates. Provides bind() function, enabling
\r
3 // FastDelegates to be rapidly compared to programs using boost::function and boost::bind.
\r
5 // Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp
\r
7 // Original author: Jody Hagins.
\r
8 // Minor changes by Don Clugston.
\r
10 // Warning: The arguments to 'bind' are ignored! No actual binding is performed.
\r
11 // The behaviour is equivalent to boost::bind only when the basic placeholder
\r
12 // arguments _1, _2, _3, etc are used in order.
\r
15 // 1.4 Dec 2004. Initial release as part of FastDelegate 1.4.
\r
18 #ifndef FASTDELEGATEBIND_H
\r
19 #define FASTDELEGATEBIND_H
\r
22 #endif // _MSC_VER > 1000
\r
24 ////////////////////////////////////////////////////////////////////////////////
\r
25 // FastDelegate bind()
\r
27 // bind() helper function for boost compatibility.
\r
28 // (Original author: Jody Hagins).
\r
30 // Add another helper, so FastDelegate can be a dropin replacement
\r
31 // for boost::bind (in a fair number of cases).
\r
32 // Note the elipses, because boost::bind() takes place holders
\r
33 // but FastDelegate does not care about them. Getting the place holder
\r
34 // mechanism to work, and play well with boost is a bit tricky, so
\r
35 // we do the "easy" thing...
\r
36 // Assume we have the following code...
\r
37 // using boost::bind;
\r
38 // bind(&Foo:func, &foo, _1, _2);
\r
39 // we should be able to replace the "using" with...
\r
40 // using fastdelegate::bind;
\r
41 // and everything should work fine...
\r
42 ////////////////////////////////////////////////////////////////////////////////
\r
44 #ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX
\r
46 namespace fastdelegate {
\r
49 template <class X, class Y, class RetType>
\r
50 FastDelegate< RetType ( ) >
\r
52 RetType (X::*func)( ),
\r
56 return FastDelegate< RetType ( ) >(y, func);
\r
59 template <class X, class Y, class RetType>
\r
60 FastDelegate< RetType ( ) >
\r
62 RetType (X::*func)( ) const,
\r
66 return FastDelegate< RetType ( ) >(y, func);
\r
70 template <class X, class Y, class RetType, class Param1>
\r
71 FastDelegate< RetType ( Param1 p1 ) >
\r
73 RetType (X::*func)( Param1 p1 ),
\r
77 return FastDelegate< RetType ( Param1 p1 ) >(y, func);
\r
80 template <class X, class Y, class RetType, class Param1>
\r
81 FastDelegate< RetType ( Param1 p1 ) >
\r
83 RetType (X::*func)( Param1 p1 ) const,
\r
87 return FastDelegate< RetType ( Param1 p1 ) >(y, func);
\r
91 template <class X, class Y, class RetType, class Param1, class Param2>
\r
92 FastDelegate< RetType ( Param1 p1, Param2 p2 ) >
\r
94 RetType (X::*func)( Param1 p1, Param2 p2 ),
\r
98 return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func);
\r
101 template <class X, class Y, class RetType, class Param1, class Param2>
\r
102 FastDelegate< RetType ( Param1 p1, Param2 p2 ) >
\r
104 RetType (X::*func)( Param1 p1, Param2 p2 ) const,
\r
108 return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func);
\r
112 template <class X, class Y, class RetType, class Param1, class Param2, class Param3>
\r
113 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >
\r
115 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ),
\r
119 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func);
\r
122 template <class X, class Y, class RetType, class Param1, class Param2, class Param3>
\r
123 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >
\r
125 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ) const,
\r
129 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func);
\r
133 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4>
\r
134 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >
\r
136 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ),
\r
140 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func);
\r
143 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4>
\r
144 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >
\r
146 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const,
\r
150 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func);
\r
154 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5>
\r
155 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >
\r
157 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ),
\r
161 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func);
\r
164 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5>
\r
165 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >
\r
167 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const,
\r
171 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func);
\r
175 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6>
\r
176 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >
\r
178 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ),
\r
182 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func);
\r
185 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6>
\r
186 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >
\r
188 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const,
\r
192 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func);
\r
196 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7>
\r
197 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >
\r
199 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ),
\r
203 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func);
\r
206 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7>
\r
207 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >
\r
209 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const,
\r
213 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func);
\r
217 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7, class Param8>
\r
218 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >
\r
220 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ),
\r
224 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func);
\r
227 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7, class Param8>
\r
228 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >
\r
230 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const,
\r
234 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func);
\r
238 #endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX
\r
240 } // namespace fastdelegate
\r
242 #endif // !defined(FASTDELEGATEBIND_H)
\r