template struct Remove; template struct Remove> // empty list { using Removed = TypeList<>; }; template // remove Rm fm the head, struct Remove> { using Removed = typename Remove>::Removed; }; // keep First, rm Rm from Tail // concatenate the two template struct Remove> { using Removed = TypeList>::Removed>; };