NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
reference_wrapper.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
2#define NEFORCE_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
3
10
12NEFORCE_BEGIN_NAMESPACE__
13
14NEFORCE_BEGIN_INNER__
16
17template <typename T>
18void __ref_wrapper_construct_aux(type_identity_t<T&>) noexcept;
19template <typename T>
20void __ref_wrapper_construct_aux(type_identity_t<T&&>) = delete;
21
22
23template <typename T, typename U, typename Dummy = void>
24struct ref_wrapper_constructable_from : false_type {};
25
26template <typename T, typename U>
27struct ref_wrapper_constructable_from<T, U,
28 void_t<decltype(inner::__ref_wrapper_construct_aux<T>(_NEFORCE declval<U>()))>>
29: true_type {};
30
31
32template <typename F, typename... Args>
33struct __invoke_result_aux;
34
36NEFORCE_END_INNER__
37
38template <typename F, typename... Args>
40
41template <typename Callable, typename... Args>
42NEFORCE_CONSTEXPR14 typename inner::__invoke_result_aux<Callable, Args...>::type
43invoke(Callable&& f, Args&&... args) noexcept(is_nothrow_invocable<Callable, Args...>::value);
44
50
60template <typename T>
62public:
64 "reference_wrapper requires an object or function type.");
65
66 using type = T;
67
68private:
69 T* ptr_{};
70
71public:
80 template <typename U, enable_if_t<conjunction<negation<is_same<remove_cvref_t<U>, reference_wrapper>>,
81 inner::ref_wrapper_constructable_from<T, U>>::value,
82 int> = 0>
83 NEFORCE_CONSTEXPR14
84 reference_wrapper(U&& x) noexcept(noexcept(inner::__ref_wrapper_construct_aux<T>(_NEFORCE declval<U>()))) {
85 T& ref = static_cast<U&&>(x);
86 ptr_ = _NEFORCE addressof(ref);
87 }
88
95 NEFORCE_CONSTEXPR14 operator T&() const noexcept { return *ptr_; }
96
101 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14 T& get() const noexcept { return *ptr_; }
102
111 template <typename... Args>
112 NEFORCE_CONSTEXPR14 typename inner::__invoke_result_aux<T&, Args...>::type operator()(Args&&... args) const
113 noexcept(is_nothrow_invocable<T&, Args...>::value) {
114 return _NEFORCE invoke(this->get(), _NEFORCE forward<Args>(args)...);
115 }
116};
117
118#ifdef NEFORCE_STANDARD_17
119template <typename T>
121#endif
122
123
131template <typename T>
132NEFORCE_NODISCARD constexpr reference_wrapper<T> ref(T& val) noexcept {
133 return reference_wrapper<T>(val);
134}
135
141template <typename T>
142void ref(const T&&) = delete;
143
150template <typename T>
151NEFORCE_NODISCARD constexpr reference_wrapper<T> ref(reference_wrapper<T> wrapper) noexcept {
152 return wrapper;
153}
154
164template <typename T>
165NEFORCE_NODISCARD constexpr reference_wrapper<const T> cref(const T& val) noexcept {
166 return reference_wrapper<const T>(val);
167}
168
174template <typename T>
175void cref(const T&&) = delete;
176
185template <typename T>
186NEFORCE_NODISCARD constexpr reference_wrapper<const T> cref(reference_wrapper<T> wrapper) noexcept {
187 return wrapper;
188}
189
190
196template <typename T>
198 using type = T;
199};
200
205template <typename T>
207 using type = T&;
208};
209
214template <typename T>
215using unwrap_reference_t = typename unwrap_reference<T>::type;
216
217
223template <typename T>
225 using type = unwrap_reference_t<decay_t<T>>;
226};
227
232template <typename T>
233using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type;
234 // ReferenceWrapper
236
237NEFORCE_END_NAMESPACE__
238#endif // NEFORCE_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
引用包装器类模板
NEFORCE_CONSTEXPR14 reference_wrapper(U &&x) noexcept(noexcept(inner::__ref_wrapper_construct_aux< T >(_NEFORCE declval< U >())))
构造函数
NEFORCE_CONSTEXPR14 inner::__invoke_result_aux< T &, Args... >::type operator()(Args &&... args) const noexcept(is_nothrow_invocable< T &, Args... >::value)
函数调用运算符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR14 T & get() const noexcept
获取包装的引用
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
NEFORCE_CONSTEXPR14 inner::__invoke_result_aux< Callable, Args... >::type invoke(Callable &&f, Args &&... args) noexcept(is_nothrow_invocable< Callable, Args... >::value)
统一调用接口
typename unwrap_reference< T >::type unwrap_reference_t
unwrap_reference的便捷别名
NEFORCE_NODISCARD constexpr reference_wrapper< T > ref(T &val) noexcept
创建引用包装器
typename unwrap_ref_decay< T >::type unwrap_ref_decay_t
unwrap_ref_decay的便捷别名
NEFORCE_NODISCARD constexpr reference_wrapper< const T > cref(const T &val) noexcept
创建const引用包装器
bool_constant< true > true_type
表示true的类型
void void_t
将任意类型映射为void
typename type_identity< T >::type type_identity_t
type_identity的便捷别名
bool_constant< false > false_type
表示false的类型
判断调用是否不会抛出异常
先退化类型,再解包引用包装器
解包引用包装器,获取原始引用类型
类型萃取