Класс function

Сохранить указатель на функцию позволяет также класс function. Прежде чем использовать класс, следует подключить заголовочный файл functional:

#include <functional>

Создание объекта осуществляется по следующим схемам:

std::function<Сигнатура_функции> func1(Название_функции);
std::function<Сигнатура_функции> func2 = Название_функции;
std::function<Сигнатура_функции> func3;
func3 = Название_функции;
std::function<Сигнатура_функции> func4 = nullptr;
func4 = Название_функции;

Внутри угловых скобок указывается сигнатура функции, состоящая из типа возвращаемого значения и типов параметров через запятую внутри круглых скобок, например, void() или int(int,int). Вызов функции осуществляется как обычно, с помощью круглых скобок, внутри которых через запятую указываются передаваемые значения. Если объект хранит нулевой указатель и при этом производится вызов функции, то генерируется исключение bad_function_call.

Пример использования класса function приведен в листинге 12.25.

Листинг 12.25. Класс function

#include <iostream>
#include <functional>

void print_ok();
void print(const char *str);
int sum(int x, int y);
int func(int x, int y, std::function<int(int,int)> f);

int main() {
   // Создание объектов
   std::function<void()> func1;
   func1 = print_ok;
   std::function<void(const char*)> func2(print);
   std::function<int(int,int)> func3 = nullptr;
   func3 = sum;
   // Вызов функций
   func1();                                    // OK
   func2("1");                                 // 1
   std::cout << func3(30, 10) << std::endl;    // 40
   // Передача в функцию
   std::cout << func(10, 5, sum) << std::endl; // 15
   return 0;
}
void print_ok() {
   std::cout << "OK" << std::endl;
}
void print(const char *str) {
   std::cout << str << std::endl;
}
int sum(int x, int y) {
   return x + y;
}
int func(int x, int y, std::function<int(int,int)> f) {
   return f(x, y);
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов