参考:
一窥模板的替换和匹配方式:偏特化的参数比泛化版本的还要多:判断是不是std::pair<,>。-CSDN博客
C:\work\hchx\HchxKernel\PublicAPI\fmt\args.h
template <typename T> struct is_reference_wrapper : std::false_type {};
template <typename T>
struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type {};
一个引用的地方:
template <typename T>
using stored_type = conditional_t<detail::is_string<T>::value &&
!has_formatter<T, Context>::value &&
!detail::is_reference_wrapper<T>::value,
std::basic_string<char_type>, T>;
reference_wrapper的定义
template<class _Ty>
class reference_wrapper
: public _Weak_types<_Ty>::type
{ // stand-in for an assignable reference
public:
static_assert(is_object_v<_Ty> || is_function_v<_Ty>,
"reference_wrapper<T> requires T to be an object type or a function type.");
using type = _Ty;
template<class _Uty,
enable_if_t<conjunction_v<
negation<is_same<remove_cv_t<remove_reference_t<_Uty>>, reference_wrapper>>,
_Refwrap_has_ctor_from<_Ty, _Uty>>, int> = 0>
reference_wrapper(_Uty&& _Val)
_NOEXCEPT_COND(_NOEXCEPT_OPER(_Refwrap_ctor_fun<_Ty>(_STD declval<_Uty>())))
{ // construct
_Ty& _Ref = _STD forward<_Uty>(_Val);
_Ptr = _STD addressof(_Ref);
}
operator _Ty&() const noexcept
{ // return reference
return (*_Ptr);
}
_NODISCARD _Ty& get() const noexcept
{ // return reference
return (*_Ptr);
}
template<class... _Types>
auto operator()(_Types&&... _Args) const
-> decltype(_STD invoke(get(), _STD forward<_Types>(_Args)...))
{ // invoke object/function
return (_STD invoke(get(), _STD forward<_Types>(_Args)...));
}
private:
_Ty * _Ptr;
}