1#ifndef NEFORCE_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
2#define NEFORCE_CORE_UTILITY_REFERENCE_WRAPPER_HPP__
12NEFORCE_BEGIN_NAMESPACE__
23template <
typename T,
typename U,
typename Dummy =
void>
24struct ref_wrapper_constructable_from :
false_type {};
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>()))>>
32template <
typename F,
typename... Args>
33struct __invoke_result_aux;
38template <
typename F,
typename... Args>
41template <
typename Callable,
typename... Args>
42NEFORCE_CONSTEXPR14
typename inner::__invoke_result_aux<Callable, Args...>::type
64 "reference_wrapper requires an object or function type.");
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,
85 T&
ref =
static_cast<U&&
>(x);
95 NEFORCE_CONSTEXPR14
operator T&()
const noexcept {
return *ptr_; }
101 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14 T&
get() const noexcept {
return *ptr_; }
111 template <
typename... Args>
112 NEFORCE_CONSTEXPR14
typename inner::__invoke_result_aux<T&, Args...>
::type operator()(Args&&... args)
const
118#ifdef NEFORCE_STANDARD_17
142void ref(
const T&&) =
delete;
237NEFORCE_END_NAMESPACE__
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
完美转发左值
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的类型
typename type_identity< T >::type type_identity_t
type_identity的便捷别名
bool_constant< false > false_type
表示false的类型
static constexpr bool value