function | f — пустой объект класса function, способный хранить вызываемые объекты с сигнатурой вызова, эквивалентной типу функции T (т.е. Т — это retType(args)) |
function | Явное создание пустого объекта класса function |
function | Сохранение копии вызываемого объекта obj в объекте f |
f | Когда f используется как условие; оно истинно, если содержит вызываемый объект, и ложно в противном случае |
f( | Вызывает объект f с передачей аргументов |
Типы, определенные как члены шаблона 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
function
function
{ return i * j; };
cout << f1(4,2) << endl; //
cout << f2(4,2) << endl; //
cout << f3(4,2) << endl; //
Теперь карту можно переопределить, используя тип function:
//
//
//
//
//
map
В эту карту можно добавить каждый из вызываемых объектов приложения, будь то указатель на функцию, лямбда-выражение или объект функции:
map
{"+", add}, //
{"-", std::minus
{"/", div()}, //
{"*", [](int i, int j) { return i * j; }}, //
// лямбда-выражение
{"%", mod} }; //
В карте пять элементов. Хотя все лежащие в основе вызываемые объекты имеют различные типы, каждый из них можно хранить в общем типе function.
Как обычно, при индексировании карты возвращается ссылка на ассоциированное значение. При индексировании карты binops возвращается ссылка на объект типа function. Тип function перегружает оператор вызова. Этот оператор вызова получает собственные аргументы и передает их хранимому вызываемому объекту:
binops["+"](10, 5); //
binops["-"](10, 5); //
binops["/"](10, 5); //
binops["*"](10, 5); //