#pragma once #include namespace util { template struct copy_const : std::type_identity {}; template struct copy_const : std::type_identity {}; template using copy_const_t = typename copy_const::type; template struct copy_volatile : std::type_identity {}; template struct copy_volatile : std::type_identity {}; template using copy_volatile_t = typename copy_volatile::type; template struct copy_cv : std::type_identity>> { }; template using copy_cv_t = typename copy_cv::type; template struct copy_reference : std::type_identity {}; template struct copy_reference : std::type_identity> {}; template struct copy_reference : std::type_identity> {}; template using copy_reference_t = typename copy_reference::type; template using copy_cvref_t = copy_reference_t< T1, copy_reference_t, T2>>>; template constexpr inline auto transmute(auto &&t1) -> copy_cvref_t { return std::forward>( reinterpret_cast>(t1)); } template constexpr inline auto transmute(auto &t1) -> copy_cvref_t { return std::forward>( reinterpret_cast>(t1)); } template constexpr inline auto transmute(T1 t1) -> T2 { return std::forward(reinterpret_cast(t1)); } } // namespace util