c++ 如何实现 std::is_class
How c++ implement std::is_class
这是 std::is_class 在 mac 中的实现。我不明白"int _Tp::*"的参数是什么。有人可以解释一下吗?参数的类型是什么,参数的名称是什么?谢谢。
另一个问题是省略号。在 C 中,它至少需要一个省略号之前的参数,但在 C++ 中,它可以只是省略号。我在哪里可以找到有关此部件的标准?
namespace __is_class_imp
{
template <class _Tp> char __test(int _Tp::*);
template <class _Tp> __two __test(...);
}
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_class
: public integral_constant<bool, sizeof(__is_class_imp::__test<_Tp>(0)) == 1 && !is_union<_Tp>::value> {};
为了回答你的一个问题,__test(...)
函数接受任意数量的任何类型的参数。但它们不能使用。va_start
宏需要一个前一个参数才能工作,没有它就无法获得任何参数。
这样做的原因是,__test
可以与任何类型的参数一起使用,但实际上不会实现。这是有效的,因为该函数仅在编译时使用,不会发生实际调用。由于它是重载的,编译器将根据所使用的类型做不同的事情。
相关文章:
- Centos7 g++ "to_string is not in a member of std"
- Where is std::hardware_destructive_interference_size?
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- What is the std::chrono::time_point equivalent of std::numer
- What is std::vector::_emplace_back_slow_path / std::vector::
- Is std::is_trivially_copyable wrong?
- Why is std::abs(9484282305798401ull) = 9484282305798400?
- What is std::invoke in c++?
- What is std::set::equal_range for?
- Is std::initializer_list{x, y, z} (CTAD) valid?
- Is a log(n) std::find_if possible?
- Is there a std::bytes?
- std::is_nothrow_constructible when constructor is inherited
- IS STD ::功能与使用自动一样有效
- Visual Studio: "str() is not a member of std::ostringstream"
- is compare_exchange_weak for std::shared_ptr broken in msvs
- Matlab's is empty for a std::vector ( C++)
- Is std::make_unique SFINAE-friendly?
- VC++ 2010 "array is not a member of std"错误
- Android NDK chrono epoch is not correct (std::chrono::high_r