Наткнулся на прикольную разминочную штуку - написать программу, реализующую FizzBuzz во время компиляции.

По-быстрому набросал вариант, который вычисляет FizzBuzz во время компиляции, но печатает в рантайме. В идеале, чтобы вообще вся работа со строками тоже была во время сборки, а в рантайме только выплёвывался уже готовый текст. Но не захотелось сейчас возиться с хаками, собирающими правильный std::array, ибо не всё, что нужно для решения, объявлено как constexpr в стандартной библиотеке. Чуть позже, может быть, сделаю.

#include <iostream>

constexpr int MAX_COUNT = 22;

template <typename T>
void Print(const T& value) {
    std::cout << value << "\n";
}

template <int, int>
struct Buzz;

template <int count = 1>
struct Next {
    Next() {
        Buzz<count, 2 * (count % 5 == 0) + (count % 3 == 0)>();
    }
};

template<>
struct Next<MAX_COUNT + 1> {
};

template<int count, int buzz>
struct Buzz {
    Buzz() { Print(count); Next<count + 1>(); }
};

template <int count>
struct Buzz<count, 1> {
    Buzz() { Print("Fizz"); Next<count + 1>(); }
};

template <int count>
struct Buzz<count, 2> {
    Buzz() { Print("Buzz"); Next<count + 1>(); }
};

template <int count>
struct Buzz<count, 3> {
    Buzz() { Print("FizzBuzz"); Next<count + 1>(); }
};

int main()
{
    Next<>();

    return 0;
}