std::function
| Определено в заголовочном файле <functional>
|
||
| template< class > class function; /* не определено */ |
(начиная с C++11) | |
| template< class R, class... Args > class function<R(Args...)>; |
(начиная с C++11) | |
Шаблон класса std::function это полиморфная обёртка функции общего назначения. Экземпляры std::function могут хранить, копировать и вызывать любые CopyConstructible Callable цели -- функции (через указатели на них), лямбда-выражения, выражения привязки или другие объекты-функции, а также указатели на функции-элементы и указатели на элементы-данных.
Сохранённый вызываемый объект называется целью объекта std::function. Если std::function не содержит цели, он называется пустым. Вызов цели пустого std::function приводит к возникновению исключения std::bad_function_call.
std::function соответствует требованиям CopyConstructible и CopyAssignable.
Содержание |
[править] Типы-элементы
| Тип | Определение |
result_type
|
R
|
argument_type(устарело в C++17)(удалено в C++20)
|
T if sizeof...(Args)==1 и T является первым и единственным типом в Args...
|
first_argument_type(устарело в C++17)(удалено в C++20)
|
T1 if sizeof...(Args)==2 и T1 является первым из двух типов в Args...
|
second_argument_type(устарело в C++17)(удалено в C++20)
|
T2 if sizeof...(Args)==2 и T2 является вторым из двух типов в Args...
|
[править] Функции-элементы
создаёт новый экземпляр std::function (public функция-элемент) | |
уничтожает экземпляр std::function (public функция-элемент) | |
| присваивает новую цель (public функция-элемент) | |
| обменивает содержимое (public функция-элемент) | |
| (удалено в C++17) |
присваивает новую цель (public функция-элемент) |
| проверяет, содержится ли цель (public функция-элемент) | |
| вызывает цель (public функция-элемент) | |
Доступ к цели | |
| получает typeid сохранённой цели (public функция-элемент) | |
| получает указатель на сохранённую цель (public функция-элемент) | |
[править] Функции, не являющиеся элементами
| (C++11) |
специализация алгоритма std::swap (шаблон функции) |
| (удалено в C++20) |
сравнивает std::function с nullptr (шаблон функции) |
[править] Вспомогательные классы
| (C++11) (до C++17) |
специализация свойства типа std::uses_allocator (специализация шаблона класса) |
[править] Принципы вывода(начиная с C++17)
[править] Примечание
|
Следует соблюдать осторожность, когда |
(до C++23) |
|
Если |
(начиная с C++23) |
std::function<const int&()> F([]{ return 42; }); // Ошибка начиная с C++23: невозможно // привязать возвращённую ссылку // к временному объекту int x = F(); // Неопределённое поведение до C++23: результатом F() является висячая ссылка std::function<int&()> G([]()->int& { static int i{0x2A}; return i; }); // OK std::function<const int&()> H([i{052}]->const int& { return i; }); // OK
[править] Пример
#include <functional> #include <iostream> struct Foo { Foo(int num) : num_(num) {} void print_add(int i) const { std::cout << num_+i << '\n'; } int num_; }; void print_num(int i) { std::cout << i << '\n'; } struct PrintNum { void operator()(int i) const { std::cout << i << '\n'; } }; int main() { // сохраняет свободную функцию std::function<void(int)> f_display = print_num; f_display(-9); // сохраняет лямбду std::function<void()> f_display_42 = []() { print_num(42); }; f_display_42(); // сохраняет результат вызова std::bind std::function<void()> f_display_31337 = std::bind(print_num, 31337); f_display_31337(); // сохраняет вызов функции-элемента std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; const Foo foo(314159); f_add_display(foo, 1); f_add_display(314159, 1); // сохраняет вызов метода доступа к элементу данных std::function<int(Foo const&)> f_num = &Foo::num_; std::cout << "num_: " << f_num(foo) << '\n'; // сохраняет вызов функции-элемента и объект using std::placeholders::_1; std::function<void(int)> f_add_display2 = std::bind( &Foo::print_add, foo, _1 ); f_add_display2(2); // сохраняет вызов функции-элемента и указатель на объект std::function<void(int)> f_add_display3 = std::bind( &Foo::print_add, &foo, _1 ); f_add_display3(3); // сохраняет вызов функционального объекта std::function<void(int)> f_display_obj = PrintNum(); f_display_obj(18); auto factorial = [](int n) { // сохраняет лямбда-объект для эмуляции "рекурсивной лямбды"; // осведомлены о дополнительных накладных расходах std::function<int(int)> fac = [&](int n){ return (n < 2) ? 1 : n*fac(n-1); }; // обратите внимание, что "auto fac = [&](int n){...};" не работает в рекурсивных // вызовах return fac(n); }; for (int i{5}; i != 8; ++i) { std::cout << i << "! = " << factorial(i) << "; "; } }
Возможный вывод:
-9 42 31337 314160 314160 num_: 314159 314161 314162 18 5! = 120; 6! = 720; 7! = 5040;
[править] Смотрите также
| (C++23) |
обёртывает вызываемый объект любого типа с указанной сигнатурой вызова функции (шаблон класса) |
| (C++11) |
исключение, возникающее при вызове пустой std::function (класс) |
| (C++11) |
создаёт объект функцию из указателя на элемент (шаблон функции) |