Немного предыстории: у меня есть несколько странных многократных вложенных циклов, которые я преобразовал в плоскую рабочую очередь (в основном сворачивание отдельных индексных циклов в один многоиндексный цикл). Прямо сейчас каждая петля закодирована вручную.
Я пытаюсь обобщить подход к работе с любыми границами, используя лямбда-выражения:
Например:
// RANGE(i,I,N) is basically a macro to generate `int i = I; i < N; ++i `
// for (RANGE(lb, N)) {
// for (RANGE(jb, N)) {
// for (RANGE(kb, max(lb, jb), N)) {
// for (RANGE(ib, jb, kb+1)) {
// is equivalent to something like (overload , to produce range)
flat<1, 3, 2, 4>((_2, _3+1), (max(_4,_3), N), N, N)
внутренняя часть квартиры что-то вроде:
template<size_t I1, size_t I2, ...,
class L1_, class L2, ..._>
boost::array<int,4> flat(L1_ L1, L2_ L2, ...){
//boost::array<int,4> current; class or static variable
// basically, the code below this is going to be done using recursion templates
// but to do that I need to apply lambda expression to current array
// to get runtime bounds
bool advance;
L2_ l2 = L2.bind(current); // bind current value to lambda
{
L1_ l1 = L1.bind(current); //bind current value to innermost lambda
l1.next();
advance = !(l1 < l1.upper()); // some internal logic
if (advance) {
l2.next();
current[0] = l1.lower();
}
}
//...,
}
мой вопрос, можете ли вы дать мне несколько идей о том, как написать лямбду (производную от boost), которую можно привязать к ссылке на индексный массив для возврата верхних и нижних границ в соответствии с лямбда-выражением?
большое спасибо
Облом, лямбда поддерживает только три заполнителя.