MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
reference_wrapper.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
2#define MSTL_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
3
10
13
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, void_t<
28 decltype(_INNER __ref_wrapper_construct_aux<T>(_MSTL declval<U>()))>>
29 : true_type {};
30
31
32template <typename F, typename... Args>
33struct __invoke_result_aux;
34
37
38template <typename F, typename... Args>
40
41template <typename Callable, typename... Args>
42MSTL_CONSTEXPR14 typename _INNER __invoke_result_aux<Callable, Args...>::type
43invoke(Callable&& f, Args&&... args)
44noexcept(is_nothrow_invocable<Callable, Args...>::value);
45
51
61template <typename T>
63public:
65 "reference_wrapper requires an object or function type.");
66
67 using type = T;
68
69private:
70 T* ptr_{};
71
72public:
81 template <typename U, enable_if_t<
83 _INNER ref_wrapper_constructable_from<T, U>>::value, int> = 0>
84 MSTL_CONSTEXPR14 reference_wrapper(U&& x)
85 noexcept(noexcept(_INNER __ref_wrapper_construct_aux<T>(_MSTL declval<U>()))) {
86 T& ref = static_cast<U&&>(x);
87 ptr_ = _MSTL addressof(ref);
88 }
89
96 MSTL_CONSTEXPR14 operator T &() const noexcept {
97 return *ptr_;
98 }
99
104 MSTL_NODISCARD MSTL_CONSTEXPR14 T& get() const noexcept {
105 return *ptr_;
106 }
107
116 template <typename... Args>
117 MSTL_CONSTEXPR14 typename _INNER __invoke_result_aux<T&, Args...>::type
118 operator ()(Args&&... args) const noexcept(is_nothrow_invocable<T&, Args...>::value) {
119 return _MSTL invoke(this->get(), _MSTL forward<Args>(args)...);
120 }
121};
122
123#if MSTL_SUPPORT_DEDUCTION_GUIDES__
124template <typename T>
126#endif
127
128
136template <typename T>
137MSTL_NODISCARD constexpr reference_wrapper<T> ref(T& val) noexcept {
138 return reference_wrapper<T>(val);
139}
140
146template <typename T>
147void ref(const T&&) = delete;
148
155template <typename T>
156MSTL_NODISCARD constexpr reference_wrapper<T> ref(reference_wrapper<T> wrapper) noexcept {
157 return wrapper;
158}
159
169template <typename T>
170MSTL_NODISCARD constexpr reference_wrapper<const T> cref(const T& val) noexcept {
171 return reference_wrapper<const T>(val);
172}
173
179template <typename T>
180void cref(const T&&) = delete;
181
190template <typename T>
191MSTL_NODISCARD constexpr reference_wrapper<const T> cref(reference_wrapper<T> wrapper) noexcept {
192 return wrapper;
193}
194
195
201template <typename T>
203 using type = T;
204};
205
210template <typename T>
212 using type = T&;
213};
214
219template <typename T>
220using unwrap_reference_t = typename unwrap_reference<T>::type;
221
222
228template <typename T>
230 using type = unwrap_reference_t<decay_t<T>>;
231};
232
237template <typename T>
238using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type;
239 // ReferenceWrapper
241
243#endif // MSTL_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
引用包装器类模板
MSTL_CONSTEXPR14 _INNER __invoke_result_aux< T &, Args... >::type operator()(Args &&... args) const noexcept(is_nothrow_invocable< T &, Args... >::value)
函数调用运算符
MSTL_CONSTEXPR14 reference_wrapper(U &&x) noexcept(noexcept(_INNER __ref_wrapper_construct_aux< T >(_MSTL declval< U >())))
构造函数
MSTL_NODISCARD MSTL_CONSTEXPR14 T & get() const noexcept
获取包装的引用
MSTL_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
MSTL_CONSTEXPR14 _INNER __invoke_result_aux< Callable, Args... >::type invoke(Callable &&f, Args &&... args) noexcept(is_nothrow_invocable< Callable, Args... >::value)
统一调用接口
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
MSTL_NODISCARD constexpr reference_wrapper< T > ref(T &val) noexcept
创建引用包装器
typename unwrap_reference< T >::type unwrap_reference_t
unwrap_reference的便捷别名
MSTL_NODISCARD constexpr reference_wrapper< const T > cref(const T &val) noexcept
创建const引用包装器
typename unwrap_ref_decay< T >::type unwrap_ref_decay_t
unwrap_ref_decay的便捷别名
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的类型
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
类型集合的逻辑与操作
判断调用是否不会抛出异常
先退化类型,再解包引用包装器
解包引用包装器,获取原始引用类型
MSTL类型萃取