00001
00002
00003
00004
00005
00006
00008 #ifndef CPPCMS_UTIL_MEM_BIND_H
00009 #define CPPCMS_UTIL_MEM_BIND_H
00010
00011 namespace cppcms { namespace util {
00012
00014 namespace details {
00015 template<typename C,typename P>
00016 struct binder0 {
00017 void (C::*member)();
00018 P object;
00019 void operator()() const { ((*object).*member)(); }
00020 };
00021 template<typename C,typename P,typename P1>
00022 struct binder1 {
00023 void (C::*member)(P1);
00024 P object;
00025 void operator()(P1 p1) const { ((*object).*member)(p1); }
00026 };
00027 template<typename C,typename P,typename P1,typename P2>
00028 struct binder2 {
00029 void (C::*member)(P1,P2);
00030 P object;
00031 void operator()(P1 p1,P2 p2) const { ((*object).*member)(p1,p2); }
00032 };
00033 template<typename C,typename P,typename P1,typename P2,typename P3>
00034 struct binder3 {
00035 void (C::*member)(P1,P2,P3);
00036 P object;
00037 void operator()(P1 p1,P2 p2,P3 p3) const { ((*object).*member)(p1,p2,p3); }
00038 };
00039 template<typename C,typename P,typename P1,typename P2,typename P3,typename P4>
00040 struct binder4 {
00041 void (C::*member)(P1,P2,P3,P4);
00042 P object;
00043 void operator()(P1 p1,P2 p2,P3 p3,P4 p4) const { ((*object).*member)(p1,p2,p3,p4); }
00044 };
00045 }
00046
00048
00053 template<typename C,typename P>
00054 details::binder0<C,P> mem_bind(void (C::*mem)(),P obj)
00055 {
00056 details::binder0<C,P> tmp={mem,obj};
00057 return tmp;
00058 }
00063 template<typename C,typename P,typename P1>
00064 details::binder1<C,P,P1> mem_bind(void (C::*mem)(P1),P obj)
00065 {
00066 details::binder1<C,P,P1> tmp={mem,obj};
00067 return tmp;
00068 }
00073 template<typename C,typename P,typename P1,typename P2>
00074 details::binder2<C,P,P1,P2> mem_bind(void (C::*mem)(P1,P2),P obj)
00075 {
00076 details::binder2<C,P,P1,P2> tmp={mem,obj};
00077 return tmp;
00078 }
00083 template<typename C,typename P,typename P1,typename P2,typename P3>
00084 details::binder3<C,P,P1,P2,P3> mem_bind(void (C::*mem)(P1,P2,P3),P obj)
00085 {
00086 details::binder3<C,P,P1,P2,P3> tmp={mem,obj};
00087 return tmp;
00088 }
00093 template<typename C,typename P,typename P1,typename P2,typename P3,typename P4>
00094 details::binder4<C,P,P1,P2,P3,P4> mem_bind(void (C::*mem)(P1,P2,P3,P4),P obj)
00095 {
00096 details::binder4<C,P,P1,P2,P3,P4> tmp={mem,obj};
00097 return tmp;
00098 }
00099
00100
00101 } }
00102
00103 #endif