#include template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template struct remove_pointers { using type = T; }; template struct remove_pointers { using type = typename remove_pointers::type; }; template struct remove_pointers { using type = typename remove_pointers::type; }; template using remove_reference_t = typename remove_reference::type; template using remove_pointers_t = typename remove_pointers::type; int main() { static_assert(std::is_same_v< remove_reference_t, int >, "remove_reference failed for 'int&&'"); static_assert(std::is_same_v< remove_reference_t, int >, "remove_reference failed for 'int&'"); static_assert(std::is_same_v< remove_reference_t, int >, "remove_reference failed for 'int'"); static_assert(std::is_same_v< remove_reference_t, int const >, "remove_reference failed for 'int const&'"); static_assert(std::is_same_v< remove_pointers_t, int >, "remove_pointers failed for 'int'"); static_assert(std::is_same_v< remove_pointers_t, int >, "remove_pointers failed for 'int*'"); static_assert(std::is_same_v< remove_pointers_t, int >, "remove_pointers failed for 'int* const'"); static_assert(std::is_same_v< remove_pointers_t, int >, "remove_pointers failed for 'int* const*'"); static_assert(std::is_same_v< remove_pointers_t, int >, "remove_pointers failed for 'int***'"); }