template<typename... T> struct TypeList; template<template<typename...>typename E, typename F, typename... Ts> struct FilterImpl; template<template<typename...>typename E, typename F, typename... OUTs> struct FilterImpl<E, F, TypeList<>, TypeList<OUTs...>> { using type = E<OUTs...>; }; template<template<typename...>typename E, typename F, typename... INs, typename... OUTs> struct FilterImpl<E, F, TypeList<F, INs...>, TypeList<OUTs...>> { using type = typename FilterImpl<E, F, TypeList<INs...>, TypeList<OUTs...>>::type; }; template<template<typename...>typename E, typename F, typename T1, typename... INs, typename... OUTs> struct FilterImpl<E, F, TypeList<T1, INs...>, TypeList<OUTs...>> { using type = typename FilterImpl<E, F, TypeList<INs...>, TypeList<T1, OUTs...>>::type; }; template<template<typename...> typename E, typename F, typename... Ts> struct Filter { using type = typename FilterImpl<E, F, TypeList<Ts...>, TypeList<>>::type; }; template<template<typename...> typename E, typename F, typename... Ts> using Filter_t = typename Filter<E, F, Ts...>::type;