Можно ли аналогично захвату контекста с помощью лямбды захватить необходимые данные с помощью обычной функции, но сохраняя необходимую сигнатуру
Можно ли аналогично захвату контекста с помощью лямбды захватить необходимые данные с помощью обычной функции, но сохраняя необходимую сигнатуру? К примеру, у меня есть функция, со следующей сигнатурой void func(functional(void(int)));с помощью лямбды я могу дополнить эту функцию объектами из контекста, в котором находится лямбда, к примеру
int a = 10;
func([&](int b, int c){
std::cout << a + b + c;
})
Могу ли я сделать примерно тоже самое, но использовав обычную функцию, не используя лямбду?. Я понимаю, что есть вариант присвоить лямбду к указателю на функцию и использовать, но в данном случае это не подходит. У меня есть подозрение, что в данном случае поможет bind, но я не очень понимаю как его использовать.
Ответы (2 шт):
Функция определяется в глобальной области, а не в локальной, и все, что она может "захватить" -глобальную переменную.
Так что у вас это может выглядеть разве что так:
int global_a_for_func;
void func(int b, int c) {
std::cout << global_a_for_func + b + c;
}
....
int main() {
int a = 10;
global_a_for_func = a; func(10,15);
Лямбда функция это функциональный класс с оператором вызова operator(). Этот класс может содержать в себе указатели на источник вызова (адрес стека например) и может использовать все локальные переменные.
Обычной функции никакой дополнительной информации не передаётся и по-этому она не может использовать переменные, что ниже по стеку.
Класс функций std::function покрывает все лямбда-функции и все статические. Это универсальный класс, с каждым типом функций работает индивидуально.