#include template struct Pack { }; namespace details { template struct Reverse; template struct Reverse, Pack> { using type = typename Reverse, Pack>::type; }; template struct Reverse, Pack> { using type = Pack; }; } template struct Reverse { using type = typename details::Reverse>::type; }; int main() { { using Input = Pack<>; using Output = Pack<>; using Result = typename Reverse::type; static_assert( std::is_same_v ); } { using Input = Pack; using Output = Pack; using Result = typename Reverse::type; static_assert( std::is_same_v ); } { using Input = Pack; using Output = Pack; using Result = typename Reverse::type; static_assert( std::is_same_v ); } { using Input = Pack; using Output = Pack; using Result = typename Reverse::type; static_assert( std::is_same_v ); } }