function f;f — пустой объект класса function, способный хранить вызываемые объекты с сигнатурой вызова, эквивалентной типу функции T (т.е. Т — это retType(args))
function f(nullptr);Явное создание пустого объекта класса function
function f(obj);Сохранение копии вызываемого объекта obj в объекте f
fКогда f используется как условие; оно истинно, если содержит вызываемый объект, и ложно в противном случае
f(args)Вызывает объект f с передачей аргументов args
Типы, определенные как члены шаблона function
result_typeТип возвращаемого значения объекта функции этого типа
argument_typefirst_argument_typesecond_argument_typeТипы, определяемые, когда у типа T есть один или два аргумента. Если у типа T есть один аргумент, то argument_type — синоним его типа. Если у типа T два аргумента, то first_argument_type и second_argument_type — синонимы их типов

Тип function — это шаблон. Подобно другим шаблонам, при создании его экземпляра следует указать дополнительную информацию. В данном случае этой информацией является сигнатура вызова объекта, который сможет представлять данный конкретный тип function. Как и у других шаблонов, этот тип определяют в угловых скобках:

function

Здесь был объявлен тип function, способный представлять вызываемые объекты, возвращающие целочисленный результат и имеющие два параметра типа int. Этот тип можно использовать для представления любого из типов приложения калькулятора:

function f1 = add;   // указатель на функцию

function f2 = div(); // объект класса объекта функции

function f3 = [](int i, int j) // лямбда-выражение

                              { return i * j; };

cout << f1(4,2) << endl; // выводит 6

cout << f2(4,2) << endl; // выводит 2

cout << f3(4,2) << endl; // выводит 8

Теперь карту можно переопределить, используя тип function:

// таблица вызываемых объектов,

// соответствующих всем бинарным операторам

// все вызываемые объекты должны получать по два int и возвращать int

// элемент может быть указателем на функцию, объектом функции или

// лямбда-выражением

map> binops;

В эту карту можно добавить каждый из вызываемых объектов приложения, будь то указатель на функцию, лямбда-выражение или объект функции:

map> binops = {

 {"+", add},               // указатель на функцию

 {"-", std::minus()}, // объект библиотечной функции

 {"/", div()},             // пользовательский объект функции

 {"*", [](int i, int j) { return i * j; }}, // безымянное

                                            // лямбда-выражение

 {"%", mod} };             // именованный объект лямбда-выражения

В карте пять элементов. Хотя все лежащие в основе вызываемые объекты имеют различные типы, каждый из них можно хранить в общем типе function.

Как обычно, при индексировании карты возвращается ссылка на ассоциированное значение. При индексировании карты binops возвращается ссылка на объект типа function. Тип function перегружает оператор вызова. Этот оператор вызова получает собственные аргументы и передает их хранимому вызываемому объекту:

binops["+"](10, 5); // вызов add(10, 5)

binops["-"](10, 5); // использует оператор; вызов объекта minus

binops["/"](10, 5); // использует оператор; вызов объекта div

binops["*"](10, 5); // вызов объекта лямбда-функции

Перейти на страницу:

Похожие книги