>>109570549
In c++26, they made this very simple:
#include <print>
#include <utility>
template<class... Ts>
struct overloads : Ts...
{
using Ts::operator()...;
};
int
main()
{
[&]<auto... i>(std::index_sequence<i...>) {
[]<auto offset, auto... ps>(this auto self) -> void {
static constexpr auto process_one = []<auto... is> {
((overloads{
[]<std::size_t n>(std::integral_constant<std::size_t, n>) -> void { std::print("{}\n", n + is...[0] - 1); },
[](std::integral_constant<std::size_t, 3>) -> void { std::print("fizz\n"); },
[](std::integral_constant<std::size_t, 5>) -> void { std::print("buzz\n"); },
[](std::integral_constant<std::size_t, 6>) -> void { std::print("fizz\n"); },
[](std::integral_constant<std::size_t, 9>) -> void { std::print("fizz\n"); },
[](std::integral_constant<std::size_t, 10>) -> void { std::print("buzz\n"); },
[](std::integral_constant<std::size_t, 12>) -> void { std::print("fizz\n"); },
[](std::integral_constant<std::size_t, 15>) -> void { std::print("fizzbuzz\n"); },
}
.template operator()(std::integral_constant<std::size_t, is - is...[0] + 1>{})),
...);
};
if constexpr (sizeof...(ps) - offset >= 15) {
[&]<auto... k>(std::index_sequence<k...>) {
process_one.template operator()<ps...[offset + k]...>();
}(std::make_index_sequence<15>{});
self.template operator()<offset + 15, ps...>();
} else if constexpr (sizeof...(ps) - offset > 0) {
[&]<auto... k>(std::index_sequence<k...>) {
process_one.template operator()<ps...[offset + k]...>();
}(std::make_index_sequence<sizeof...(ps) - offset>{});
}
}.template operator()<0, (i+1)...>();
}(std::make_index_sequence<100>{});
}