Spec-Zone.ru › C++

Именованные требования C++: функциональный объект

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

Требования

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

  • Тип T удовлетворяет требованиям std::is_object, и

Заданы

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

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

Выражение Требования
f(args) выполняет вызов функции

Примечания

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

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

  • Все указатели на функции удовлетворяют этому требованию.
  • Все функциональные объекты, определённые в <functional>.
  • Некоторые типы возвращаемых значений функций из <functional>.

Пример

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

#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); // calls foo using the pointer to function

    std::invoke(fp, 2); // all FunctionObject types are Callable

    auto fn = std::function(foo); // see also the rest of <functional>
    fn(3);
    fn.operator()(3); // the same effect as fn(3)

    struct S
    {
        void operator()(int x) const { std::cout << "S::operator(" << x << ")\n"; }
    } s;
    s(4); // calls s.operator()
    s.operator()(4); // the same as s(4)

    auto lam = [](int x) { std::cout << "lambda(" << x << ")\n"; };
    lam(5); // calls the lambda
    lam.operator()(5); // the same as lam(5)

    struct T
    {
        using FP = void (*)(int);
        operator FP() const { return bar; }
    } t;
    t(6); // t is converted to a function pointer
    static_cast<void (*)(int)>(t)(6); // the same as t(6)
    t.operator T::FP()(6); // the same as 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)

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/FunctionObject

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API