summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMurray Cumming <murrayc@murrayc.com>2016-03-04 13:38:06 +0100
committerMurray Cumming <murrayc@murrayc.com>2016-03-04 13:39:03 +0100
commit59c7f316a6d74527ab1b7ce6678182e9791f2ad5 (patch)
treeec71402a5e27108f0c61322c27c45018f9216fb3
parent768fd70ef402eb5d49118db45abe44f46897cc0d (diff)
downloadsigc++-variadic_bind4.tar.gz
mem_fun.h.m4: Make bound_*_mem_functor template aliases of a bound_mem_functor_base.variadic_bind4
As for *_mem_functor. This avoids the repetition
-rw-r--r--sigc++/functors/macros/mem_fun.h.m494
1 files changed, 55 insertions, 39 deletions
diff --git a/sigc++/functors/macros/mem_fun.h.m4 b/sigc++/functors/macros/mem_fun.h.m4
index dd29677..9c83afd 100644
--- a/sigc++/functors/macros/mem_fun.h.m4
+++ b/sigc++/functors/macros/mem_fun.h.m4
@@ -49,45 +49,13 @@ define([BOUND_MEMBER_FUNCTOR],[dnl
*
* @ingroup mem_fun
*/
-template <class T_return, class T_obj, class... T_arg>
-class bound_[$1]mem_functor
- : public [$1]mem_functor<T_return, T_obj, T_arg...>
-{
- using base_type_ = [$1]mem_functor<T_return, T_obj, T_arg...>;
-public:
- using function_type = typename base_type_::function_type;
-
- /** Constructs a bound_[$1]mem_functor object that wraps the passed method.
- * @param _A_obj Pointer to instance the method will operate on.
- * @param _A_func Pointer to method will be invoked from operator()().
- */
- bound_[$1]mem_functor($2 T_obj* _A_obj, function_type _A_func)
- : base_type_(_A_func),
- obj_(*_A_obj)
- {}
-
- /** Constructs a bound_[$1]mem_functor object that wraps the passed method.
- * @param _A_obj Reference to instance the method will operate on.
- * @param _A_func Pointer to method will be invoked from operator()().
- */
- bound_[$1]mem_functor($2 T_obj& _A_obj, function_type _A_func)
- : base_type_(_A_func),
- obj_(_A_obj)
- {}
-
- /** Execute the wrapped method operating on the stored instance.
- * @param _A_a... Argument to be passed on to the method.
- * @return The return value of the method invocation.
- */
- decltype(auto)
- operator()(type_trait_take_t<T_arg>... _A_a) const
- { return (obj_.invoke().*(this->func_ptr_))(_A_a...); }
-
-//protected:
- // Reference to stored object instance.
- // This is the handler object, such as TheObject in void TheObject::signal_handler().
- [$1]limit_reference<T_obj> obj_;
-};
+template<class T_return, class T_obj, class... T_arg>
+using bound_[$1]mem_functor =
+ bound_mem_functor_base<
+ [$1]limit_reference<T_obj>,
+ T_return (T_obj::*)(T_arg...) $3,
+ $2 T_obj,
+ T_return, T_obj, T_arg...>;
#ifndef DOXYGEN_SHOULD_SKIP_THIS
//template specialization of visitor<>::do_visit_each<>(action, functor):
@@ -253,6 +221,54 @@ MEMBER_FUNCTOR([],[],[])
MEMBER_FUNCTOR([const_],[const],[const])
MEMBER_FUNCTOR([volatile_],[],[volatile])
MEMBER_FUNCTOR([const_volatile_],[const],[const volatile])
+
+//TODO: Change T_limit_reference to a template template parameter,
+//but without having to specify both of the limit_reference<typename, typename>
+//typenames?
+template <class T_limit_reference,
+ class T_func, class T_obj_with_modifier,
+ class T_return, class T_obj, class... T_arg>
+class bound_mem_functor_base
+: mem_functor_base<T_func, T_obj_with_modifier, T_return, T_obj, T_arg...>
+{
+ using base_type = mem_functor_base<T_func, T_obj_with_modifier, T_return, T_obj, T_arg...>;
+public:
+ using function_type = typename base_type::function_type;
+ using result_type = typename base_type::result_type;
+
+ /** Constructs a bound_mem_functor_base object that wraps the passed method.
+ * @param _A_obj Pointer to instance the method will operate on.
+ * @param _A_func Pointer to method will be invoked from operator()().
+ */
+ bound_mem_functor_base(T_obj_with_modifier* _A_obj, function_type _A_func)
+ : base_type(_A_func),
+ obj_(*_A_obj)
+ {}
+
+ /** Constructs a bound_mem_functor_base object that wraps the passed method.
+ * @param _A_obj Reference to instance the method will operate on.
+ * @param _A_func Pointer to method will be invoked from operator()().
+ */
+ bound_mem_functor_base(T_obj_with_modifier& _A_obj, function_type _A_func)
+ : base_type(_A_func),
+ obj_(_A_obj)
+ {}
+
+ /** Execute the wrapped method operating on the stored instance.
+ * @param _A_a... Argument to be passed on to the method.
+ * @return The return value of the method invocation.
+ */
+ decltype(auto)
+ operator()(type_trait_take_t<T_arg>... _A_a) const
+ { return (obj_.invoke().*(this->func_ptr_))(_A_a...); }
+
+//protected: TODO?
+ // Reference to stored object instance.
+ // This is the handler object, such as TheObject in void TheObject::signal_handler().
+ //TODO? T_limit_reference<T_obj> obj_;
+ T_limit_reference obj_;
+};
+
BOUND_MEMBER_FUNCTOR([],[],[])
BOUND_MEMBER_FUNCTOR([const_],[const],[const])
BOUND_MEMBER_FUNCTOR([volatile_],[],[volatile])