int x = 1; static_assert(__is_same(int, int)); auto y = new int(1); #if 0 template struct A { template struct B { template struct C { using type = type_list; }; }; }; template struct Test { using result = typename A::template B::template C::type; }; #elif 0 template struct A { using type = type_list; }; template struct B { using type = typename A::type; }; template struct C { using type = typename B::type; }; template struct Test { using result = typename C::type; }; #elif 0 template struct A { using type = type_list; }; template struct B { using type = typename U::type; }; template > struct Test { using result = typename B::type; }; #elif 0 // #include template struct A { template using type = type_list; }; template struct B { using base = A; template struct rebind { using other = typename base::template type; }; }; template struct Test { using result = typename B::template rebind::other; }; // #include template struct Test { // using result = typename std::_Vector_base>::_Tp_alloc_type; // using result = typename __gnu_cxx::__alloc_traits>::template // rebind::other; using result = typename B::template rebind::other; }; #elif 0 // #include template struct X { using type = type_list; }; template typename List> struct X> { using type = type_list; }; template struct Result { using result = typename X>::type; }; X>::type x; #elif 1 #include #include // For a specialization `SomeTemplate` and a type `U` the member // `type` is `SomeTemplate`, otherwise there is no member `type`. template struct replace_first_arg {}; template