Namespaces
Variants

C++ named requirements: FunctionObject

From cppreference.net
C++ named requirements

A FunctionObject — это тип объекта, который может быть использован слева от оператора вызова функции.

Содержание

Требования

Тип T удовлетворяет требованиям FunctionObject если

Дано

  • f , значение типа T или const T ,
  • args , подходящий список аргументов, который может быть пустым.

Следующие выражения должны быть корректными:

Expression Requirements
f ( args ) выполняет вызов функции

Примечания

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

Стандартная библиотека

Пример

Демонстрирует различные типы функциональных объектов.

#include <functional>
#include <iostream>
void foo(int x) { std::cout << "foo(" << x << ")\n"; }
void bar(int x) { std::cout << "bar(" << x << ")\n"; }
int main()
{
    void(*fp)(int) = foo;
    fp(1); // вызывает foo через указатель на функцию
    std::invoke(fp, 2); // все типы FunctionObject являются Callable
    auto fn = std::function(foo); // см. также остальную часть <functional>
    fn(3);
    fn.operator()(3); // тот же эффект, что и fn(3)
    struct S
    {
        void operator()(int x) const { std::cout << "S::operator(" << x << ")\n"; }
    } s;
    s(4); // вызывает s.operator()
    s.operator()(4); // то же самое, что и s(4)
    auto lam = [](int x) { std::cout << "lambda(" << x << ")\n"; };
    lam(5); // вызывает лямбду
    lam.operator()(5); // то же самое, что и lam(5)
    struct T
    {
        using FP = void (*)(int);
        operator FP() const { return bar; }
    } t;
    t(6); // t преобразуется в указатель на функцию
    static_cast<void (*)(int)>(t)(6); // то же самое, что и t(6)
    t.operator T::FP()(6); // то же самое, что и t(6) 
}

Вывод:

foo(1)
foo(2)
foo(3)
foo(3)
S::operator(4)
S::operator(4)
lambda(5)
lambda(5)
bar(6)
bar(6)
bar(6)

Смотрите также

тип, для которого определена операция вызова
(именованное требование)