Шаблон std::function<>

Последнее обновление: 25.03.2023

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850