Решение с использованием жесткого кода будет выглядеть следующим образом:
for (int a1 : {-2,-1,0,1,2}) {
for (int a2 : {-2,-1,0,1,2}) {
for (int a3 : {-2,-1,0,1,2}) {
for (int a4 : {-2,-1,0,1,2}) {
for (int a5 : {-2,-1,0,1,2}) {
do_job5(a1, a2, a3, a4, a5);
}
}
}
}
}
Для более общего способа вы можете использовать следующее:
bool increase(std::size_t size, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] > size) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
template <typename F, typename T>
void self_cartesian_product(F&& f, const std::vector<T>& v, std::size_t N)
{
std::vector<std::size_t> it(N, 0);
do {
f(v, it);
} while (increase(v.size(), it));
}
При вызове, аналогичном
self_cartesian_product([](const auto& v, const auto& indexes)
{
for (auto i : indexes) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
},
std::vector<int>{-2, -1, 0, 1, 2},
3);
Демо