При использовании объектов-функций и лямбда-выражений следует помнить, что они не эквивалентны указателям на функции. Чтобы упростить совместное использование
указателей на функции, объектов-функций и лямбда-выражений модуль <functional> определяет шаблон std::function<>.
std::function представляет нечто, что может вызываться как функция - это может быть и указатель на функцию, и объект-функция, и лямбда-выражение. Рассмотрим, как мы можем его использовать:
#include <iostream>
#include <functional> // для std::function
class Sum
{
public:
int operator()(int a, int b){ return a + b;}
};
int subtract(int a, int b){return a - b;}
int main()
{
std::function<int(int,int)> operation;
operation = Sum{}; // operation представляет объект-функцию Sum
std::cout << operation(10, 6) << std::endl; // 16
operation = subtract; // operation представляет функцию subtract
std::cout << operation(10, 6) << std::endl; // 4
auto multiply = [](int a, int b){return a * b;};
operation = multiply; // operation представляет лямбда-выражение multiply
std::cout << operation(10, 6) << std::endl; // 60
}
Для использования типа std::function прежде всего необходимо подключить заголовочный файл <functional>
#include <functional>
В функции main определяем переменную std::function:
std::function<int(int,int)> operation;
Переменная operation предсталяет некоторую функцию, которая имеет два параметра типа int и возвращает также значение типа int.
Мы можем присвоить этой переменной объект-функцию:
operation = Sum{};
Обычную функцию:
operation = subtract;
Или лямбда-выражение:
auto multiply = [](int a, int b){return a * b;};
operation = multiply;
Для вызова все этих функций вызываем operation как функцию, передавая ее параметрам некоторые значения:
operation(10, 6)
Другой пример
#include <iostream>
#include <string>
#include <functional> // для std::function
class Console
{
public:
void operator()(const std::string& message)
{
std::cout << message << std::endl;
}
};
void print(const std::string& message)
{
std::cout << message << std::endl;
}
int main()
{
std::function<void(std::string)> action;
action = Console{};
action("Word");
action = print;
action("Work");
auto log = [](const std::string& mes){std::cout << mes << std::endl;};
action = log;
action("World");
}
Здесь переменная action представляет некоторую функцию, которая принимает строку и ничего не возвращает - std::function<void(std::string)>