[libsigcplusplus/c++17v3] C++17: Use std::invoke().
- From: Murray Cumming <murrayc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsigcplusplus/c++17v3] C++17: Use std::invoke().
- Date: Fri, 8 Jul 2016 19:54:47 +0000 (UTC)
commit 6af94db6715057960ef649f24fcb6a7c8ee48061
Author: Murray Cumming <murrayc murrayc com>
Date: Fri Jul 8 21:53:30 2016 +0200
C++17: Use std::invoke().
This makes code more generic. Maybe this will let us simplify code.
I don't actually have a compiler (or its standard library) that supports
this, so this probably does not build.
sigc++/adaptors/adaptor_trait.h | 7 +++++--
sigc++/adaptors/bind.h | 5 +++--
sigc++/adaptors/bind_return.h | 3 ++-
sigc++/adaptors/compose.h | 13 +++++++++----
sigc++/adaptors/exception_catch.h | 3 ++-
sigc++/adaptors/hide.h | 2 +-
sigc++/adaptors/retype.h | 1 +
sigc++/adaptors/retype_return.h | 6 ++++--
sigc++/adaptors/track_obj.h | 5 ++++-
sigc++/functors/mem_fun.h | 5 +++--
sigc++/functors/ptr_fun.h | 5 ++++-
sigc++/functors/slot.h | 7 +++++--
sigc++/signal.h | 2 +-
sigc++/visit_each.h | 2 +-
14 files changed, 45 insertions(+), 21 deletions(-)
---
diff --git a/sigc++/adaptors/adaptor_trait.h b/sigc++/adaptors/adaptor_trait.h
index 7a534e8..8fb9bb5 100644
--- a/sigc++/adaptors/adaptor_trait.h
+++ b/sigc++/adaptors/adaptor_trait.h
@@ -25,6 +25,7 @@
#include <sigc++/functors/ptr_fun.h>
#include <sigc++/functors/mem_fun.h>
#include <sigc++/adaptors/adaptor_base.h>
+#include <functional>
/*
* The idea here is simple. To prevent the need to
@@ -87,7 +88,9 @@ struct adaptor_functor : public adaptor_base
/** Invokes the wrapped functor passing on the arguments.
* @return The return value of the functor invocation.
*/
- decltype(auto) operator()() const { return functor_(); }
+ decltype(auto) operator()() const {
+ std::invoke(functor_);
+ }
/** Invokes the wrapped functor passing on the arguments.
* @param arg Arguments to be passed on to the functor.
@@ -96,7 +99,7 @@ struct adaptor_functor : public adaptor_base
template <typename... T_arg>
decltype(auto) operator()(T_arg&&... arg) const
{
- return functor_(std::forward<T_arg>(arg)...);
+ return std::invoke(functor_, std::forward<T_arg>(arg)...);
}
/// Constructs an invalid functor.
diff --git a/sigc++/adaptors/bind.h b/sigc++/adaptors/bind.h
index 08e1ee7..e93250b 100644
--- a/sigc++/adaptors/bind.h
+++ b/sigc++/adaptors/bind.h
@@ -26,6 +26,7 @@
#include <sigc++/tuple-utils/tuple_start.h>
#include <sigc++/tuple-utils/tuple_end.h>
#include <sigc++/tuple-utils/tuple_transform_each.h>
+#include <functional>
namespace sigc
@@ -171,7 +172,7 @@ private:
template <typename T, std::size_t... Is>
decltype(auto) call_functor_operator_parentheses(T&& tuple, std::index_sequence<Is...>)
{
- return (this->functor_)(std::get<Is>(std::forward<T>(tuple))...);
+ return std::invoke(this->functor_, std::get<Is>(std::forward<T>(tuple))...);
}
};
@@ -219,7 +220,7 @@ private:
template <typename T, std::size_t... Is>
decltype(auto) call_functor_operator_parentheses(T&& tuple, std::index_sequence<Is...>)
{
- return (this->functor_)(std::get<Is>(std::forward<T>(tuple))...);
+ return std::invoke(this->functor_, std::get<Is>(std::forward<T>(tuple))...);
}
};
diff --git a/sigc++/adaptors/bind_return.h b/sigc++/adaptors/bind_return.h
index 0da105e..99a4eb6 100644
--- a/sigc++/adaptors/bind_return.h
+++ b/sigc++/adaptors/bind_return.h
@@ -49,6 +49,7 @@ struct bind_return_functor : public adapts<T_functor>
template <typename... T_arg>
inline typename unwrap_reference<T_return>::type operator()(T_arg... a)
{
+ //TODO: Use std::invoke() here?
this->functor_.template operator()<type_trait_pass_t<T_arg>...>(a...);
return ret_value_.invoke();
}
@@ -71,7 +72,7 @@ template <typename T_return, typename T_functor>
typename unwrap_reference<T_return>::type
bind_return_functor<T_return, T_functor>::operator()()
{
- this->functor_();
+ std::invoke(this->functor_);
return ret_value_.invoke();
}
diff --git a/sigc++/adaptors/compose.h b/sigc++/adaptors/compose.h
index fb4e081..f8b21d1 100644
--- a/sigc++/adaptors/compose.h
+++ b/sigc++/adaptors/compose.h
@@ -19,6 +19,7 @@
#ifndef SIGC_ADAPTORS_COMPOSE_H
#define SIGC_ADAPTORS_COMPOSE_H
#include <sigc++/adaptors/adapts.h>
+#include <functional>
namespace sigc
{
@@ -61,12 +62,14 @@ namespace sigc
template <typename T_setter, typename T_getter>
struct compose1_functor : public adapts<T_setter>
{
- decltype(auto) operator()() { return this->functor_(get_()); }
+ decltype(auto) operator()() {
+ return std::invoke(this->functor_, get_());
+ }
template <typename... T_arg>
decltype(auto) operator()(T_arg&&... a)
{
- return this->functor_(get_(std::forward<T_arg>(a)...));
+ return std::invoke(this->functor_, get_(std::forward<T_arg>(a)...));
}
/** Constructs a compose1_functor object that combines the passed functors.
@@ -95,12 +98,14 @@ struct compose1_functor : public adapts<T_setter>
template <typename T_setter, typename T_getter1, typename T_getter2>
struct compose2_functor : public adapts<T_setter>
{
- decltype(auto) operator()() { return this->functor_(get1_(), get2_()); }
+ decltype(auto) operator()() {
+ return std::invoke(this->functor_, get1_(), get2_());
+ }
template <typename... T_arg>
decltype(auto) operator()(T_arg... a)
{
- return this->functor_(get1_(a...), get2_(a...));
+ return std::invoke(this->functor_, get1_(a...), get2_(a...));
}
/** Constructs a compose2_functor object that combines the passed functors.
diff --git a/sigc++/adaptors/exception_catch.h b/sigc++/adaptors/exception_catch.h
index a4c6c2c..7f7e569 100644
--- a/sigc++/adaptors/exception_catch.h
+++ b/sigc++/adaptors/exception_catch.h
@@ -80,7 +80,7 @@ struct exception_catch_functor : public adapts<T_functor>
{
try
{
- return this->functor_();
+ return std::invoke(this->functor_);
}
catch (...)
{
@@ -93,6 +93,7 @@ struct exception_catch_functor : public adapts<T_functor>
{
try
{
+ //TODO: Use std::invoke here?
return this->functor_.template operator()<type_trait_pass_t<T_arg>...>(a...);
}
catch (...)
diff --git a/sigc++/adaptors/hide.h b/sigc++/adaptors/hide.h
index 6b17cea..a6acdf3 100644
--- a/sigc++/adaptors/hide.h
+++ b/sigc++/adaptors/hide.h
@@ -122,7 +122,7 @@ private:
template <typename T_tuple, std::size_t... Is>
decltype(auto) call_functor_operator_parentheses(T_tuple& tuple, std::index_sequence<Is...>)
{
- return this->functor_.template operator()(std::get<Is>(tuple)...);
+ return std::invoke(this->functor_, std::get<Is>(tuple)...);
}
};
diff --git a/sigc++/adaptors/retype.h b/sigc++/adaptors/retype.h
index 32f778b..b006e4c 100644
--- a/sigc++/adaptors/retype.h
+++ b/sigc++/adaptors/retype.h
@@ -82,6 +82,7 @@ struct retype_functor : public adapts<T_functor>
template <typename... T_arg>
decltype(auto) operator()(T_arg... a)
{
+ //TODO: Use std::invoke() here?
return this->functor_.template operator()<type_trait_take_t<T_type>...>(
static_cast<T_type>(a)...);
}
diff --git a/sigc++/adaptors/retype_return.h b/sigc++/adaptors/retype_return.h
index 9e5df6f..2b5d776 100644
--- a/sigc++/adaptors/retype_return.h
+++ b/sigc++/adaptors/retype_return.h
@@ -41,6 +41,7 @@ struct retype_return_functor : public adapts<T_functor>
template <typename... T_arg>
inline T_return operator()(T_arg&&... a)
{
+ //TODO: Use std::invoke() here?
return T_return(this->functor_.template operator() < T_arg... > (std::forward<T_arg>(a)...));
}
@@ -60,7 +61,7 @@ template <typename T_return, typename T_functor>
T_return
retype_return_functor<T_return, T_functor>::operator()()
{
- return T_return(this->functor_());
+ return T_return(std::invoke(this->functor_));
}
/** Adaptor that performs a C-style cast on the return value of a functor.
@@ -81,6 +82,7 @@ struct retype_return_functor<void, T_functor> : public adapts<T_functor>
template <typename... T_arg>
inline void operator()(T_arg... a)
{
+ //TODO: Use std::invoke() here?
this->functor_.template operator()<T_arg...>(a...);
}
@@ -92,7 +94,7 @@ template <typename T_functor>
void
retype_return_functor<void, T_functor>::operator()()
{
- this->functor_();
+ std::invoke(this->functor_);
}
#ifndef DOXYGEN_SHOULD_SKIP_THIS
diff --git a/sigc++/adaptors/track_obj.h b/sigc++/adaptors/track_obj.h
index 9256011..dd8bf85 100644
--- a/sigc++/adaptors/track_obj.h
+++ b/sigc++/adaptors/track_obj.h
@@ -83,7 +83,9 @@ public:
/** Invokes the wrapped functor.
* @return The return value of the functor invocation.
*/
- decltype(auto) operator()() { return this->functor_(); }
+ decltype(auto) operator()() {
+ return std::invoke(this->functor_);
+ }
/** Invokes the wrapped functor passing on the arguments.
* @param arg Arguments to be passed on to the functor.
@@ -92,6 +94,7 @@ public:
template <typename... T_arg>
decltype(auto) operator()(T_arg&&... arg)
{
+ //TODO: Use std::invoke() here?
return this->functor_.template operator()<type_trait_pass_t<T_arg>...>(
std::forward<T_arg>(arg)...);
}
diff --git a/sigc++/functors/mem_fun.h b/sigc++/functors/mem_fun.h
index d53b967..813d74e 100644
--- a/sigc++/functors/mem_fun.h
+++ b/sigc++/functors/mem_fun.h
@@ -21,6 +21,7 @@
#include <sigc++/type_traits.h>
#include <sigc++/limit_reference.h>
#include <sigc++/member_method_trait.h>
+#include <functional>
// implementation notes:
// - we do not use bind here, because it would introduce
@@ -113,7 +114,7 @@ public:
*/
decltype(auto) operator()(obj_type_with_modifier& obj, type_trait_take_t<T_arg>... a) const
{
- return (obj.*func_ptr_)(a...);
+ return std::invoke(func_ptr_, obj, a...);
}
protected:
@@ -152,7 +153,7 @@ public:
*/
decltype(auto) operator()(type_trait_take_t<T_arg>... a) const
{
- return (obj_.invoke().*(this->func_ptr_))(a...);
+ return std::invoke(this->func_ptr_, obj_, a...);
}
// protected:
diff --git a/sigc++/functors/ptr_fun.h b/sigc++/functors/ptr_fun.h
index 12e2015..c680a2e 100644
--- a/sigc++/functors/ptr_fun.h
+++ b/sigc++/functors/ptr_fun.h
@@ -19,6 +19,7 @@
#ifndef SIGC_FUNCTORS_PTR_FUN_H
#define SIGC_FUNCTORS_PTR_FUN_H
#include <sigc++/type_traits.h>
+#include <functional>
namespace sigc
{
@@ -92,7 +93,9 @@ public:
* @param a Arguments to be passed on to the function.
* @return The return value of the function invocation.
*/
- T_return operator()(type_trait_take_t<T_args>... a) const { return func_ptr_(a...); }
+ T_return operator()(type_trait_take_t<T_args>... a) const {
+ return std::invoke(func_ptr_, a...);
+ }
};
/** Creates a functor of type sigc::pointer_functor which wraps an existing non-member function.
diff --git a/sigc++/functors/slot.h b/sigc++/functors/slot.h
index 419cfa2..3fb75a1 100644
--- a/sigc++/functors/slot.h
+++ b/sigc++/functors/slot.h
@@ -23,6 +23,7 @@
#include <sigc++/visit_each.h>
#include <sigc++/adaptors/adaptor_trait.h>
#include <sigc++/functors/slot_base.h>
+#include <functional>
#include <memory>
@@ -191,8 +192,10 @@ public:
*/
inline T_return operator()(type_trait_take_t<T_arg>... a) const
{
- if (!empty() && !blocked())
- return (reinterpret_cast<call_type>(slot_base::rep_->call_))(slot_base::rep_, a...);
+ if (!empty() && !blocked()) {
+ return std::invoke(reinterpret_cast<call_type>(slot_base::rep_->call_), slot_base::rep_, a...);
+ }
+
return T_return();
}
diff --git a/sigc++/signal.h b/sigc++/signal.h
index c666617..e6a6090 100644
--- a/sigc++/signal.h
+++ b/sigc++/signal.h
@@ -281,7 +281,7 @@ private:
decltype(auto) call_call_type_operator_parentheses_with_tuple(
const slot_type& slot, const std::tuple<T_arg...>& tuple, std::index_sequence<Is...>) const
{
- return (slot)(std::get<Is>(tuple)...);
+ return std::invoke(slot, std::get<Is>(tuple)...);
}
};
diff --git a/sigc++/visit_each.h b/sigc++/visit_each.h
index 51b53aa..e07abd9 100644
--- a/sigc++/visit_each.h
+++ b/sigc++/visit_each.h
@@ -44,7 +44,7 @@ struct limit_trackable_target
{
//Only call action_() if T_Type derives from trackable.
if constexpr(is_base_of_or_same_v<sigc::trackable, T_type>) {
- action_(type);
+ std::invoke(action_, type);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]