#pragma once #ifdef __cplusplus namespace types::traits::inner { template struct remove_pointer { using type = Tp; }; template struct remove_pointer { using type = T; }; template struct remove_reference { using type = Tr; }; template struct remove_reference { using type = T; }; } // namespace types::traits::inner namespace types::traits { template struct remove_pointer : inner::remove_pointer { }; template struct remove_reference : inner::remove_reference { }; template struct add_pointer { using type = T*; }; template struct add_reference { using type = T&; }; } // namespace types::traits namespace types { template T&& move(T& val) { return static_cast(val); } template T&& forward(typename traits::remove_reference::type& val) { return static_cast(val); } } // namespace types #endif