#include <array>
#include <bitset>
#include <iostream>

template <std::size_t N>
bool increase(std::bitset<N>& bs)
{
    for (std::size_t i = 0; i != bs.size(); ++i) {
        if (bs.flip(i).test(i) == true) {
            return true;
        }
    }
    return false;
}

template <typename T, std::size_t N>
void print_combinaison(const std::array<T, N>& a)
{
    std::bitset<N> bs;

    do {
        for (std::size_t i = 0; i != N; ++i) {
            if (bs.test(i)) {
                std::cout << a[i] << " ";
            }
        }
        std::cout << std::endl;
    } while (increase(bs));
}

int main()
{
    const std::array<int, 5> a {1, 2, 3, 4, 5};
    print_combinaison(a);
    return 0;
}
