Можно ли аналогично захвату контекста с помощью лямбды захватить необходимые данные с помощью обычной функции, но сохраняя необходимую сигнатуру

Можно ли аналогично захвату контекста с помощью лямбды захватить необходимые данные с помощью обычной функции, но сохраняя необходимую сигнатуру? К примеру, у меня есть функция, со следующей сигнатурой void func(functional(void(int)));с помощью лямбды я могу дополнить эту функцию объектами из контекста, в котором находится лямбда, к примеру

int a = 10;
func([&](int b, int c){
  std::cout << a + b + c;
})

Могу ли я сделать примерно тоже самое, но использовав обычную функцию, не используя лямбду?. Я понимаю, что есть вариант присвоить лямбду к указателю на функцию и использовать, но в данном случае это не подходит. У меня есть подозрение, что в данном случае поможет bind, но я не очень понимаю как его использовать.


Ответы (2 шт):

Автор решения: Mikhailo

Функция определяется в глобальной области, а не в локальной, и все, что она может "захватить" -глобальную переменную.

Так что у вас это может выглядеть разве что так:

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);
→ Ссылка
Автор решения: AlexGlebe

Лямбда функция это функциональный класс с оператором вызова operator(). Этот класс может содержать в себе указатели на источник вызова (адрес стека например) и может использовать все локальные переменные.

Обычной функции никакой дополнительной информации не передаётся и по-этому она не может использовать переменные, что ниже по стеку.

Класс функций std::function покрывает все лямбда-функции и все статические. Это универсальный класс, с каждым типом функций работает индивидуально.

→ Ссылка