// enable_iftemplate <bool, typename _Tp = void>struct enable_if {};template <typename _Tp>struct enable_if<true, _Tp>{ typedef _Tp type; }// integral_constanttemplate<typename _Tp, _Tp __v>struct integral_constant{ static constexpr _Tp value = __v; typedef _Tp value_type; typedef integral_constant<_Tp, __v> type; constexpr value_type operator()() const noexcept { return value; }};/// The type used as a compile-time boolean with true value.typedef integral_constant<bool, true> true_type;/// The type used as a compile-time boolean with false value.typedef integral_constant<bool, false> false_type;
<type_traits> 值得好好读
第一局部,定义了integral_constant以及
* Template utilities for compile-time introspection and modification,* including type classification traits, type property inspection traits* and type transformation traits.using true_type = integral_constant<bool, true>;using false_type = integral_constant<bool, false>;
定义默认模板类继承
false_type
,而后对符合要求的内建类型进行偏特化,继承true_type
同时一些也利用了可变模板参数(如
conditional
、and
、or
)第二局部,定义了
destructible
和constructible
type properties.* Utility to simplify expressions used in unevaluated operands* declval is commonly used in templates where acceptable template parameters may have no constructor in common, but have the same member function whose return type is needed.declval 在不结构对象(不求值的状况下返回成员函数的返回值)
这一部分用于判断是否可结构/析构,那么肯定波及判断是否含有结构/析构函数,这为咱们判断某个类是否存在某个函数提供了思路。假如要判断的函数是
testfunc()
class true_type{};class false_type{};struct _has_testfunc_impl{ template <typename _Tp, typename = decltype(std::declval(_Tp)().testfunc())> static true_type __test(int); template <typename> static false_type __test(...);}template<typename _Tp>struct has_testfunc : public _has_testfunc_impl{ using type = decltype(__test<_Tp>(0));}