diff options
author | Murray Cumming <murrayc@murrayc.com> | 2016-03-05 09:47:32 +0100 |
---|---|---|
committer | Murray Cumming <murrayc@murrayc.com> | 2016-03-05 09:47:32 +0100 |
commit | 1d057ed67373e26128400533b98417deab4954d7 (patch) | |
tree | f12b28bfb8d34a54f47a3f9c62c8531f7d22765f | |
parent | 114e87a53d2506a7176ed9ab6d6faf84b07fcb3e (diff) | |
download | sigc++-1d057ed67373e26128400533b98417deab4954d7.tar.gz |
limit_reference_base<>: Avoid the need for the T_trackable template parameter.
By using std::conditional_t and std::is_const<>::value.
-rw-r--r-- | sigc++/macros/limit_reference.h.m4 | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/sigc++/macros/limit_reference.h.m4 b/sigc++/macros/limit_reference.h.m4 index c8feabd..f8e4205 100644 --- a/sigc++/macros/limit_reference.h.m4 +++ b/sigc++/macros/limit_reference.h.m4 @@ -40,7 +40,7 @@ define([LIMIT_REFERENCE],[dnl * - @e T_type The type of the reference. */ template <class T_type> -using [$1]limit_reference = limit_reference_base<[$2]T_type, [$3]T_type, [$2]trackable>; +using [$1]limit_reference = limit_reference_base<[$2]T_type, [$3]T_type>; ]) divert(0) @@ -73,7 +73,7 @@ namespace sigc { * * - @e T_type The type of the reference. */ -template <class T_type, class T_type_invoke_result, class T_trackable, +template <class T_type, class T_type_invoke_result, bool I_derives_trackable = std::is_base_of<trackable, std::decay_t<T_type>>::value> class limit_reference_base @@ -109,8 +109,8 @@ private: /** limit_reference_base object for a class that derives from trackable. * - @e T_type The type of the reference. */ -template <class T_type, class T_type_invoke_result, class T_trackable> -class limit_reference_base<T_type, T_type_invoke_result, T_trackable, true> +template <class T_type, class T_type_invoke_result> +class limit_reference_base<T_type, T_type_invoke_result, true> { public: /** Constructor. @@ -136,9 +136,12 @@ public: { return invoked; } private: + using trackable_type = typename std::conditional_t< + std::is_const<T_type>::value, const trackable, trackable>; + /** The trackable reference. */ - T_trackable& visited; + trackable_type& visited; /** The reference. */ @@ -154,12 +157,12 @@ private: * @param _A_action The functor to invoke. * @param _A_target The visited instance. */ -template <class T_type, class T_type_invoke_result, class T_trackable> -struct visitor<limit_reference_base<T_type, T_type_invoke_result, T_trackable> > +template <class T_type, class T_type_invoke_result> +struct visitor<limit_reference_base<T_type, T_type_invoke_result> > { template <class T_action> static void do_visit_each(const T_action& _A_action, - const limit_reference_base<T_type, T_type_invoke_result, T_trackable>& _A_target) + const limit_reference_base<T_type, T_type_invoke_result>& _A_target) { sigc::visit_each(_A_action, _A_target.visit()); } |