30 #ifndef _GLIBCXX_REFWRAP_H
31 #define _GLIBCXX_REFWRAP_H 1
33 #pragma GCC system_header
35 #if __cplusplus < 201103L
43 namespace std _GLIBCXX_VISIBILITY(default)
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 template<
typename _Functor,
typename = __
void_t<>>
52 template<
typename _Functor>
54 __void_t<typename _Functor::result_type>>
55 {
typedef typename _Functor::result_type result_type; };
61 template<
typename _Functor>
67 template<
typename _Res,
typename... _ArgTypes>
69 {
typedef _Res result_type; };
71 template<
typename _Res,
typename... _ArgTypes>
73 {
typedef _Res result_type; };
75 template<
typename _Res,
typename... _ArgTypes>
76 struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
77 {
typedef _Res result_type; };
79 template<
typename _Res,
typename... _ArgTypes>
80 struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
81 {
typedef _Res result_type; };
83 template<
typename _Res,
typename... _ArgTypes>
84 struct _Weak_result_type_impl<_Res(_ArgTypes...) volatile>
85 {
typedef _Res result_type; };
87 template<
typename _Res,
typename... _ArgTypes>
88 struct _Weak_result_type_impl<_Res(_ArgTypes......) volatile>
89 {
typedef _Res result_type; };
91 template<
typename _Res,
typename... _ArgTypes>
92 struct _Weak_result_type_impl<_Res(_ArgTypes...) const volatile>
93 {
typedef _Res result_type; };
95 template<
typename _Res,
typename... _ArgTypes>
96 struct _Weak_result_type_impl<_Res(_ArgTypes......) const volatile>
97 {
typedef _Res result_type; };
100 template<
typename _Res,
typename... _ArgTypes>
102 {
typedef _Res result_type; };
104 template<
typename _Res,
typename... _ArgTypes>
106 {
typedef _Res result_type; };
109 template<
typename _Res,
typename... _ArgTypes>
111 {
typedef _Res result_type; };
113 template<
typename _Res,
typename... _ArgTypes>
115 {
typedef _Res result_type; };
118 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
120 {
typedef _Res result_type; };
122 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
124 {
typedef _Res result_type; };
127 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
129 {
typedef _Res result_type; };
131 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
133 {
typedef _Res result_type; };
136 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
138 {
typedef _Res result_type; };
140 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
142 {
typedef _Res result_type; };
145 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
148 {
typedef _Res result_type; };
150 template<
typename _Res,
typename _Class,
typename... _ArgTypes>
153 {
typedef _Res result_type; };
159 template<
typename _Functor>
165 template<
typename _Tp,
typename = __
void_t<>>
166 struct _Refwrap_base_arg1
170 template<
typename _Tp>
171 struct _Refwrap_base_arg1<_Tp,
172 __void_t<typename _Tp::argument_type>>
174 typedef typename _Tp::argument_type argument_type;
178 template<
typename _Tp,
typename = __
void_t<>>
179 struct _Refwrap_base_arg2
183 template<
typename _Tp>
184 struct _Refwrap_base_arg2<_Tp,
185 __void_t<typename _Tp::first_argument_type,
186 typename _Tp::second_argument_type>>
188 typedef typename _Tp::first_argument_type first_argument_type;
189 typedef typename _Tp::second_argument_type second_argument_type;
198 template<
typename _Tp>
204 template<
typename _Res,
typename _T1>
209 template<
typename _Res,
typename _T1>
210 struct _Reference_wrapper_base<_Res(_T1) const>
211 : unary_function<_T1, _Res>
214 template<
typename _Res,
typename _T1>
215 struct _Reference_wrapper_base<_Res(_T1) volatile>
216 : unary_function<_T1, _Res>
219 template<
typename _Res,
typename _T1>
220 struct _Reference_wrapper_base<_Res(_T1) const volatile>
221 : unary_function<_T1, _Res>
225 template<
typename _Res,
typename _T1,
typename _T2>
226 struct _Reference_wrapper_base<_Res(_T1, _T2)>
227 : binary_function<_T1, _T2, _Res>
230 template<
typename _Res,
typename _T1,
typename _T2>
231 struct _Reference_wrapper_base<_Res(_T1, _T2) const>
232 : binary_function<_T1, _T2, _Res>
235 template<
typename _Res,
typename _T1,
typename _T2>
236 struct _Reference_wrapper_base<_Res(_T1, _T2) volatile>
237 : binary_function<_T1, _T2, _Res>
240 template<
typename _Res,
typename _T1,
typename _T2>
241 struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile>
242 : binary_function<_T1, _T2, _Res>
246 template<
typename _Res,
typename _T1>
247 struct _Reference_wrapper_base<_Res(*)(_T1)>
248 : unary_function<_T1, _Res>
252 template<
typename _Res,
typename _T1,
typename _T2>
253 struct _Reference_wrapper_base<_Res(*)(_T1, _T2)>
254 : binary_function<_T1, _T2, _Res>
258 template<
typename _Res,
typename _T1>
259 struct _Reference_wrapper_base<_Res (_T1::*)()>
260 : unary_function<_T1*, _Res>
264 template<
typename _Res,
typename _T1,
typename _T2>
265 struct _Reference_wrapper_base<_Res (_T1::*)(_T2)>
266 : binary_function<_T1*, _T2, _Res>
270 template<
typename _Res,
typename _T1>
271 struct _Reference_wrapper_base<_Res (_T1::*)() const>
272 : unary_function<const _T1*, _Res>
276 template<
typename _Res,
typename _T1,
typename _T2>
277 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const>
278 : binary_function<const _T1*, _T2, _Res>
282 template<
typename _Res,
typename _T1>
283 struct _Reference_wrapper_base<_Res (_T1::*)() volatile>
284 : unary_function<volatile _T1*, _Res>
288 template<
typename _Res,
typename _T1,
typename _T2>
289 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile>
290 : binary_function<volatile _T1*, _T2, _Res>
294 template<
typename _Res,
typename _T1>
295 struct _Reference_wrapper_base<_Res (_T1::*)() const volatile>
296 : unary_function<const volatile _T1*, _Res>
300 template<
typename _Res,
typename _T1,
typename _T2>
301 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile>
302 : binary_function<const volatile _T1*, _T2, _Res>
310 template<
typename _Tp>
330 operator _Tp&()
const noexcept
331 {
return this->
get(); }
337 template<
typename... _Args>
338 typename result_of<_Tp&(_Args&&...)>::type
339 operator()(_Args&&... __args)
const
341 return std::__invoke(
get(), std::forward<_Args>(__args)...);
347 template<
typename _Tp>
353 template<
typename _Tp>
354 inline reference_wrapper<const _Tp>
358 template<
typename _Tp>
359 void ref(
const _Tp&&) =
delete;
361 template<
typename _Tp>
362 void cref(
const _Tp&&) =
delete;
365 template<
typename _Tp>
366 inline reference_wrapper<_Tp>
368 {
return ref(__t.get()); }
371 template<
typename _Tp>
372 inline reference_wrapper<const _Tp>
374 {
return cref(__t.get()); }
378 _GLIBCXX_END_NAMESPACE_VERSION
383 #endif // _GLIBCXX_REFWRAP_H
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
reference_wrapper< const _Tp > cref(const _Tp &__t) noexcept
Denotes a const reference should be taken to a variable.
Primary class template for reference_wrapper.
reference_wrapper< _Tp > ref(_Tp &__t) noexcept
Denotes a reference should be taken to a variable.
If we have found a result_type, extract it.