#include template struct Pack {}; template struct Prepend; template struct Prepend> { using type = Pack; }; template struct Replace { using type = P; }; template struct Replace> { using type = typename Prepend>::type>::type; }; template struct Replace> { using type = typename Prepend>::type>::type; }; int main() { // replace no doubles with void { using Input = Pack; using Answer = Pack; using Output = typename Replace::type; static_assert( std::is_same_v ); } // Replace one float with double { using Input = Pack; using Answer = Pack; using Output = typename Replace::type; static_assert( std::is_same_v ); } // Replace multiple floats with doubles { using Input = Pack; using Answer = Pack; using Output = typename Replace::type; static_assert( std::is_same_v ); } // Replace multiple ints with float { using Input = Pack; using Answer = Pack; using Output = typename Replace::type; static_assert( std::is_same_v ); } }