@@ -115,6 +115,22 @@ constexpr auto invoke(Type T::*member, Self&& self, Args&&... args) noexcept(
115
115
(std::forward<Self>(self)->*member)(std::forward<Args>(args)...)) {
116
116
return (std::forward<Self>(self)->*member)(std::forward<Args>(args)...);
117
117
}
118
+ // / Invokes the given pointer to a scalar member by reference
119
+ template <typename T, typename Type, typename Self>
120
+ constexpr auto
121
+ invoke (Type T::*member,
122
+ Self&& self) noexcept (noexcept (std::forward<Self>(self).*member))
123
+ -> decltype(std::forward<Self>(self).*member) {
124
+ return (std::forward<Self>(self).*member);
125
+ }
126
+ // / Invokes the given pointer to a scalar member by pointer
127
+ template <typename T, typename Type, typename Self>
128
+ constexpr auto
129
+ invoke (Type T::*member,
130
+ Self&& self) noexcept (noexcept (std::forward<Self>(self)->*member))
131
+ -> decltype(std::forward<Self>(self)->*member) {
132
+ return std::forward<Self>(self)->*member;
133
+ }
118
134
119
135
// / Deduces to a true type if the callable object can be invoked with
120
136
// / the given arguments.
@@ -140,6 +156,20 @@ struct can_invoke<Pointer, identity<T*, Args...>,
140
156
decltype (
141
157
(void )((std::declval<T*>()->*std::declval<Pointer>())(
142
158
std::declval<Args>()...)))> : std::true_type {};
159
+ template <typename Pointer, typename T>
160
+ struct can_invoke <Pointer, identity<T&>,
161
+ decltype ((void )(std::declval<T&>().*std::declval<Pointer>()))>
162
+ : std::true_type {};
163
+ template <typename Pointer, typename T>
164
+ struct can_invoke <Pointer, identity<T&&>,
165
+ decltype ((void )(std::declval<T&&>().*
166
+ std::declval<Pointer>()))> : std::true_type {
167
+ };
168
+ template <typename Pointer, typename T>
169
+ struct can_invoke <Pointer, identity<T*>,
170
+ decltype (
171
+ (void )(std::declval<T*>()->*std::declval<Pointer>()))>
172
+ : std::true_type {};
143
173
} // end namespace invocation
144
174
145
175
namespace overloading {
0 commit comments