При использовании объектов-функций и лямбда-выражений следует помнить, что они не эквивалентны указателям на функции. Чтобы упростить совместное использование
указателей на функции, объектов-функций и лямбда-выражений модуль <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 <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)>