📜  在C++中绑定函数和占位符

📅  最后修改于: 2021-05-25 22:33:46             🧑  作者: Mango

有时,我们需要根据需要操纵函数的操作,即将一些参数更改为default等。将函数预定义为具有默认参数会限制函数的通用性,并迫使我们使用默认参数,并且也使用具有相似值的参数每一次。从C++ 11开始,bind函数的引入使此任务更加容易。

bind()如何工作?
在占位符的帮助下绑定函数,有助于操纵函数要使用的值的位置和数量,并根据所需的输出修改函数。

什么是占位符?
占位符是命名空间,它控制值在函数的位置。它们由_1,_2,_3表示

// C++ code to demonstrate bind() and
// placeholders
#include 
#include  // 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 
#include  // 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;
}

输出:

The value of function is : 10
The value of function after changing placeholder position is : -14

在上面的代码中,即使在函数调用中1和13的位置相同,占位符位置的变化也改变了函数的调用方式。

2.占位符的数量确定传递函数所需的参数数量
我们可以使用任何数字。函数调用语句中的占位符数量(显然小于参数的最大数量)。其余值将替换为用户定义的默认值。

// C++ code to demonstrate placeholder 
// property 2
#include      
#include  // 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;  
}

输出:

The value of function with 1 placeholder is : 4
The value of function with 2 placeholders is : 10
The value of function with 3 placeholders is : 8

在上面的代码中,显然没有。的占位符等于调用该函数所需的参数数量。函数的绑定由占位符的数量和位置指示。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”