#include template struct Pack { }; template struct Add_Type; template struct Add_Type> { using type = Pack; }; template struct Remove_Type; template struct Remove_Type> { using type = Pack<>; }; template struct Remove_Type> { using type = typename Remove_Type>::type; }; template struct Remove_Type> { using type = typename Add_Type>::type>::type; }; int main() { // Testing Add_Type { using Target = int; using Indata = Pack; using Answer = Pack; using Result = typename Add_Type::type; static_assert( std::is_same_v ); } // No types to remove { using Target = int; using Indata = Pack; using Answer = Pack; using Result = typename Remove_Type::type; static_assert( std::is_same_v ); } // One to remove, in the beginning { using Target = int; using Indata = Pack; using Answer = Pack; using Result = typename Remove_Type::type; static_assert( std::is_same_v ); } // Multiple to remove, not in the beginning, other than int { using Target = float; using Indata = Pack; using Answer = Pack; using Result = typename Remove_Type::type; static_assert( std::is_same_v ); } }