Функция привязки и заполнители в C ++
Иногда нам нужно манипулировать работой функции в соответствии с необходимостью, например, изменять некоторые аргументы на значения по умолчанию и т. Д. Предварительное определение функции с аргументами по умолчанию ограничивает универсальность функции и вынуждает нас использовать аргументы по умолчанию, а также с одинаковым значением каждый время. Начиная с C ++ 11, введение функции связывания упростило эту задачу.
Как работает bind ()?
Функция привязки с помощью заполнителей помогает управлять положением и количеством значений, которые будут использоваться функцией, и изменяет функцию в соответствии с желаемым результатом.
Что такое заполнители?
Заполнители - это пространство имен, которое определяет положение значения в функции. Они представлены _1, _2, _3 …
// C++ code to demonstrate bind() and // placeholders #include <iostream> #include <functional> // for bind() using namespace std; // for placeholders using namespace std::placeholders; // Driver function to demonstrate bind() void func( int a, int b, int c) { cout << (a - b - c) << endl; } int main() { // for placeholders using namespace std::placeholders; // Use of bind() to bind the function // _1 is for first parameter and assigned // to 'a' in above declaration. // 2 is assigned to b // 3 is assigned to c auto fn1 = bind(func, _1, 2, 3); // 2 is assigned to a. // _1 is for first parameter and assigned // to 'b' in above declaration. // 3 is assigned to c. auto fn2 = bind(func, 2, _1, 3); // calling of modified functions fn1(10); fn2(10); return 0; } |
Выход:
5 -11
В приведенном выше коде bind () изменил вызов функции, приняв 1 аргумент, и вернул желаемый результат.
Свойства заполнителей
1. Положение заполнителя определяет позицию значения в операторе вызова функции.
// C++ code to demonstrate placeholder // property 1 #include <iostream> #include <functional> // for bind() using namespace std; // for placeholders using namespace std::placeholders; // Driver function to demonstrate bind() void func( int a, int b, int c) { cout << (a - b - c) << endl; } int main () { // for placeholders using namespace std::placeholders; // Second parameter to fn1() is assigned // to 'a' in fun(). // 2 is assigned to 'b' in fun // First parameter to fn1() is assigned // to 'c' in fun(). auto fn1 = bind(func, _2, 2, _1); // calling of function cout << "The value of function is : " ; fn1(1, 13); // First parameter to fn2() is assigned // to 'a' in fun(). // 2 is assigned to 'b' in fun // Second parameter to fn2() is assigned // to 'c' in fun(). auto fn2 = bind(func, _1, 2, _2); // calling of same function cout << "The value of function after changing" " placeholder position is : " ; fn2(1, 13); return 0; } |
Выход:
Значение функции: 10 Значение функции после изменения позиции заполнителя: -14
В приведенном выше коде, хотя позиции 1 и 13 были одинаковыми при вызове функции, изменение положения заполнителей изменило способ вызова функции.
2. Количество заполнителей определяет количество аргументов, необходимых для передачи функции.
Мы можем использовать любое «нет». заполнителей в операторе вызова функции (очевидно, меньше максимального количества аргументов). Остальные значения заменяются пользовательскими значениями по умолчанию.
// C++ code to demonstrate placeholder // property 2 #include <iostream> #include <functional> // for bind() using namespace std; // for placeholders using namespace std::placeholders; // Driver function to demonstrate bind() void func( int a, int b, int c) { cout << (a - b - c) << endl; } int main() { // for placeholders using namespace std::placeholders; // 1 placeholder auto fn1 = bind(func, _1, 2, 4); // calling of function with 1 argument cout << "The value of function with 1 " "placeholder is : " ; fn1(10); // 2 placeholders auto fn2 = bind(func,_1,2,_2); // calling of function with 2 arguments cout << "The value of function with 2" " placeholders is : " ; fn2(13, 1); // 3 placeholders auto fn3 = bind(func,_1, _3, _2); // calling of function with 3 arguments cout << "The value of function with 3 " "placeholders is : " ; fn3(13, 1, 4); return 0; } |
Выход:
Значение функции с 1 заполнителем: 4 Значение функции с двумя заполнителями: 10 Значение функции с 3 заполнителями: 8
В приведенном выше коде явно нет. заполнителей равняется количеству аргументов, необходимых для вызова функции. Связывание функции определяется количеством и положением заполнителей.
Эта статья предоставлена Манджитом Сингхом . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.