#pragma once #include #ifdef __cplusplus namespace types { template struct constant_value { static constexpr T value = _value; }; using true_type = constant_value; using false_type = constant_value; }; namespace types::traits { template struct condition { using type = TFalse; }; template struct condition { using type = TTrue; }; template struct remove_pointer { using type = T; }; template struct remove_pointer { using type = T; }; template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template struct add_pointer { using type = T*; }; template struct add_reference { using type = T&; }; template struct remove_cv { using type = T; }; template struct remove_cv { using type = T; }; template struct remove_cv { using type = T; }; template struct remove_cv { using type = T; }; template struct add_const { using type = const T; }; template struct add_const { using type = const T; }; template <> struct add_const { using type = void; }; template struct is_pointer : false_type { }; template struct is_pointer : true_type { }; template struct is_const : public false_type { }; template struct is_const : public true_type { }; template class T, typename...> struct is_template_instance : public false_type { }; template