gpt4 book ai didi

c++ - libcxx 中 std::is_function 的实现如何工作?

转载 作者:行者123 更新时间:2023-12-02 10:57:32 26 4
gpt4 key购买 nike

libcxx/include/type_traits , std::is_function以如此紧凑的方式实现:

namespace __libcpp_is_function_imp
{
struct __dummy_type {};
template <class _Tp> char __test(_Tp*);
template <class _Tp> char __test(__dummy_type);
template <class _Tp> __two __test(...);
template <class _Tp> _Tp& __source(int);
template <class _Tp> __dummy_type __source(...);
}

template <class _Tp, bool = is_class<_Tp>::value ||
is_union<_Tp>::value ||
is_void<_Tp>::value ||
is_reference<_Tp>::value ||
__is_nullptr_t<_Tp>::value >
struct __libcpp_is_function
: public integral_constant<bool,
sizeof(__libcpp_is_function_imp::__test<_Tp>(
__libcpp_is_function_imp::__source<_Tp>(0))) == 1>
{};
template <class _Tp> struct __libcpp_is_function<_Tp, true> : public false_type {};

template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_function
: public __libcpp_is_function<_Tp> {};

我大致了解了。 如果一个类型不匹配任何非函数类型(class、union、void、reference、nullptr_t),则它是函数类型。。但是,我找不到这行的含义:

sizeof(__libcpp_is_function_imp::__test<_Tp>(__libcpp_is_function_imp::__source<_Tp>(0))) == 1

我认为,__libcpp_is_function_imp::__source<_Tp>(0) 的结果类型应该是_Tp& 。所以结果类型为__libcpp_is_function_imp::__test<_Tp>(_Tp&)应该是_two 。和sizeof(_two)应等于 2,与 1 不同。换句话说,方程sizeof(__libcpp_is_function_imp::__test<_Tp>(__libcpp_is_function_imp::__source<_Tp>(0))) == 1总是错误的。

但我一定搞错了。谁能指点一下我吗?

最佳答案

C++ 中的每种类型都属于以下类别之一,可能是 cv 限定的:

  • 无效
  • decltype(nullptr)(又名 std::nullptr_t)
  • 算术
  • 数组
  • 指针(T*对于某些类型T)
  • 引用(左值或右值)
  • 指向非静态成员的指针
  • 枚举
  • 结构
  • union
  • 功能

消除了 classunionvoid、reference 和 std::nullptr_t 后,我们剩下了以下可能的类型:

  • 算术
  • 数组
  • 指针
  • 指向非静态成员的指针
  • 枚举
  • 功能

剩余的模板元编程利用了有关这些剩余类别中的类型的两个事实:

  • 如果_Tpabominable function type ,那么创建引用类型 _Tp& 的尝试格式不正确。否则,_Tp& 的格式正确。
  • 否则,当且仅当 _Tp 是函数类型时,类型 _Tp 才可以通过 function-to- 转换为 _Tp*指针转换。

留给读者作为练习来确定为什么使用 classunionvoid、reference 和 std::nullptr_t 类型必须在早期阶段消除,此测试才能正常工作。

关于c++ - libcxx 中 std::is_function 的实现如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58488885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com