C++ именованные требования: FunctionObject
Тип FunctionObject — это тип объекта, который может использоваться слева от оператора вызова функции.
Требования
Тип 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/w/cpp/named_req/FunctionObject