Utils: Allow membind-ing const member functions
g0dil [Tue, 17 Mar 2009 14:51:18 +0000 (14:51 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1156 270642c3-0616-0410-b53a-bc976706d245

Utils/impl/membind.hh
Utils/membind.hh
Utils/membind.test.cc

index 3dad9bf..5146e4c 100644 (file)
@@ -34,6 +34,12 @@ boost::function<R()> membind(R (T::* fn)(),scOBTYPE ob)
     return boost::bind(fn,ob);
 }
 
+template <typename R, typename T>
+boost::function<R()> membind(R (T::* fn)() const,scOBTYPE ob)
+{
+    return boost::bind(fn,ob);
+}
+
 // for BOOST_PP_ITERATION() in 2..9 do
 #define BOOST_PP_ITERATION_PARAMS_1 (4, (2, 9, SENF_ABSOLUTE_INCLUDE_PATH(Utils/impl/membind.hh), 1))
 #include BOOST_PP_ITERATE()
@@ -50,6 +56,13 @@ membind(R (T::* fn)( scPARAMS(A) ), scOBTYPE ob)
     return boost::bind(fn, ob, scPARAMS(_) );
 }
 
+template < typename R, typename T, scPARAMS(typename A) >
+boost::function<R ( scPARAMS(A) )>
+membind(R (T::* fn)( scPARAMS(A) ) const, scOBTYPE ob)
+{
+    return boost::bind(fn, ob, scPARAMS(_) );
+}
+
 #undef scPARAMS
 #undef scARG
 
index 3ac24d3..c2baf86 100644 (file)
@@ -25,8 +25,8 @@
 
 /** \defgroup membind Bound Member Functions
 
-    The membind() family of function templates simplifies the creation
-    of simple bound member function pointers:
+    The membind() family of function templates simplifies the creation of simple bound member
+    function pointers:
 
     \code
       struct Foo {
       int rv = f(1); // Calls foo->test(1)
     \endcode
 
-    \idea Make the \a ob argument type an additional P template
-    parameter (using call_traits for the exact arg type? Probably
-    we'll get deduction problems then) . The only operation this
-    object must support is ob->*fn. This would allow the use of
-    smart pointers. We should keep the T & version to still support
-    ob.*fn use.
+    senf::membind() takes either a pointer or an object as second argument. When passing an object,
+    <em>that object will be copied into the bound member function returned.</em>
+
+    \idea Make the \a ob argument type an additional P template parameter (using call_traits for the
+    exact arg type? Probably we'll get deduction problems then) . The only operation this object
+    must support is ob->*fn. This would allow the use of smart pointers. We should keep the T &
+    version to still support ob.*fn use.
  */
 
 #ifndef HH_SENF_Utils_membind_
index d3517cd..14982ce 100644 (file)
@@ -44,7 +44,7 @@ namespace {
             return "meth1()";
         }
 
-        std::string meth2(int foo, int bar) {
+        std::string meth2(int foo, int bar) const {
             std::stringstream s;
             s << "meth2(" << foo << "," << bar << ")";
             return s.str();