summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMurray Cumming <murrayc@murrayc.com>2016-03-05 09:47:32 +0100
committerMurray Cumming <murrayc@murrayc.com>2016-03-05 09:47:32 +0100
commit1d057ed67373e26128400533b98417deab4954d7 (patch)
treef12b28bfb8d34a54f47a3f9c62c8531f7d22765f
parent114e87a53d2506a7176ed9ab6d6faf84b07fcb3e (diff)
downloadsigc++-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.m419
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());
}