Функция привязки и заполнители в C ++

Опубликовано: 1 Января, 2022

Иногда нам нужно манипулировать работой функции в соответствии с необходимостью, например, изменять некоторые аргументы на значения по умолчанию и т. Д. Предварительное определение функции с аргументами по умолчанию ограничивает универсальность функции и вынуждает нас использовать аргументы по умолчанию, а также с одинаковым значением каждый время. Начиная с 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, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++ C