Я работаю над библиотекой, которая использует лямбда-выражения для определения области действия выражений. Поскольку библиотека должна выдавать уникальные целые числа для идентификации каждой переменной, идеально, если библиотека, а не пользователь, создает переменные, а пользовательский код получает их в качестве аргументов лямбда-выражений.
(Другими словами, я реализую аналог C ++ "call \ fresh" от miniKanren.)
Поскольку пользователь может захотеть ввести любое число от нуля до множества свежих переменных в конкретной области, я хочу, чтобы пользователь мог передавать в библиотеку лямбда-выражения с различным количеством аргументов. Однако я не знаю ни одного (простого) способа (в C ++ 14) определить число параметров для произвольного лямбда-объекта.
Мне пришла в голову мысль, почему бы не передать фиксированное число (скажем, 10) аргументов идентификатора переменной в лямбду, и чтобы код пользователя использовал эллипсы в лямбде, чтобы игнорировать ненужные? Примерно так:
auto no_args = call_fresh([](...) { return success(); });
auto one_arg = call_fresh([](var A, ...) { return A == 1; });
auto two_args = call_fresh([](var A, var B, ...) { return A == 1 && B == 2; });
Кажется, что проводник компилятора принимает эллипсы в списках лямбда-параметров, по крайней мере, с помощью gcc.
Это будет называться примерно так (обратите внимание, что код всегда передает 10 идентификаторов переменных независимо от того, называет ли «f» только один, два или ни одного из них):
template <typename F>
auto call_fresh(F f)
{
return [f](StateCounter sc) {
return f(sc+0,sc+1,sc+2,sc+3,sc+4,
sc+5,sc+6,sc+7,sc+8,sc+9);
};
}
Разумеется, я удивился, что существует такая особенность, есть ли причина не использовать лямбды с эллипсами?