У меня есть целое число N, которое я знаю во время компиляции. У меня также есть целые числа std:: array, описывающие форму N -мерного массива. Я хочу генерировать вложенные циклы, как описано ниже, во время компиляции, используя методы метапрограммирования.
constexpr int N {4};
constexpr std::array<int, N> shape {{1,3,5,2}};
auto f = [/* accept object which uses coords */] (auto... coords) {
// do sth with coords
};
// This is what I want to generate.
for(int i = 0; i < shape[0]; i++) {
for(int j = 0; j < shape[1]; j++) {
for(int k = 0; k < shape[2]; k++) {
for(int l = 0; l < shape[3]; l++) {
f(i,j,k,l) // object is modified via the lambda function.
}
}
}
}
Обратите внимание, что параметр N известен во время компиляции, но может непредсказуемо изменяться между компиляциями, поэтому я не могу жестко закодировать петли, как указано выше. В идеале механизм генерации цикла обеспечит интерфейс, который принимает функцию лямбда, генерирует петли и вызывает функцию, генерирующую эквивалентный код, как указано выше. Я знаю, что можно написать эквивалентный цикл во время выполнения с одним циклом while и массивом индексов, и есть ответы на этот вопрос. Я, однако, не заинтересован в этом решении. Меня также не интересуют решения, связанные с маской препроцессора.