/// Copied from libcxx type_traits and simplified #pragma once namespace std { template <class _Tp, _Tp __v> struct integral_constant { static const _Tp value = __v; typedef _Tp value_type; typedef integral_constant type; }; typedef integral_constant<bool, true> true_type; typedef integral_constant<bool, false> false_type; // is_same, functional template <class _Tp, class _Up> struct is_same : public false_type {}; template <class _Tp> struct is_same<_Tp, _Tp> : public true_type {}; // is_integral, for some types. template <class _Tp> struct is_integral : public integral_constant<bool, false> {}; template <> struct is_integral<bool> : public integral_constant<bool, true> {}; template <> struct is_integral<char> : public integral_constant<bool, true> {}; template <> struct is_integral<short> : public integral_constant<bool, true> {}; template <> struct is_integral<int> : public integral_constant<bool, true> {}; template <> struct is_integral<long> : public integral_constant<bool, true> {}; template <> struct is_integral<long long> : public integral_constant<bool, true> {}; // enable_if, functional template <bool _C, typename _Tp> struct enable_if{}; template <typename _Tp> struct enable_if<true, _Tp>{ using type = _Tp; }; }