#include <type_traits>

template <typename...>
struct Pack { };

/* Implement Reverse here */

int main()
{
    {
        using Input  = Pack<>;
        using Output = Pack<>;

        using Result = typename Reverse<Input>::type;
        static_assert( std::is_same_v<Result, Output> );
    }

    {
        using Input  = Pack<int>;
        using Output = Pack<int>;

        using Result = typename Reverse<Input>::type;
        static_assert( std::is_same_v<Result, Output> );
    }

    {
        using Input  = Pack<int, float>;
        using Output = Pack<float, int>;

        using Result = typename Reverse<Input>::type;
        static_assert( std::is_same_v<Result, Output> );
    }

    {
        using Input  = Pack<int, float, bool>;
        using Output = Pack<bool, float, int>;

        using Result = typename Reverse<Input>::type;
        static_assert( std::is_same_v<Result, Output> );
    }
}