C++ named requirements: FunctionObject
From cppreference.net
C++
C++ named requirements
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A FunctionObject — это тип объекта, который может быть использован слева от оператора вызова функции.
Содержание |
Требования
Тип
T
удовлетворяет требованиям
FunctionObject
если
-
Тип
Tудовлетворяет std::is_object , и
Дано
-
f, значение типаTилиconst T, -
args, подходящий список аргументов, который может быть пустым.
Следующие выражения должны быть корректными:
| Expression | Requirements |
|---|---|
| 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); // вызывает 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)
Смотрите также
|
тип, для которого определена операция вызова
(именованное требование) |