zoukankan      html  css  js  c++  java
  • c++11-bind的用法

    bind函数

    在c++11之前,要绑定某个函数、函数对象或者成员函数的不同参数值需要用到不同的转换器,如bind1st、bind2nd、fun_ptr、mem_fun和mem_fun_ref等.在c++11中,绑定参数的方法得以简化.c++11提供了"一站式"绑定模板bind,其用法为:

    #include <functional>
    std::bind(待绑定的函数对象/函数指针/成员函数指针,参数绑定值1,参数绑定值2,...,参数绑定值n);

     bind的第一个参数是待绑定的函数对象或者函数指针,之后跟随多个参数以设定待绑定函数的参数绑定方式。待绑定函数有多少个参数,则bind后便需要多少个参数以一一声明其参数的绑定方法.当参数绑定为某一固定值时,则其对应参数绑定值可以使一个变量或常量.当需要将参数与绑定所生成的函数对象的某个参数相关联时,则需要用到在标准中预定义的几个常量_1、_2、_3等.这些常量声明在std::placeholders命名空间内.

    绑定成员函数的注意点:

    在将一个R (T::*ptr)(Arg0,Arg1,...)形式的成员函数指针ptr用bind绑定参数时,bind的第一个绑定的参数是成员函数的调用者,随后跟随成员函数的参数绑定方式.例如bind(ptr,a,b,c)将会调用a.*ptr(b,c)。当采用_n常量将首参数与函数对象的参数相关联时,所生成的函数对象自动可接受T类型的引用及指针类型,无需再进行封装.但要想调用外部数据的成员函数,还需要用ref()、cref()来包装或者绑定一个对该变量的指针.

     1 #include <functional>
     2 #include <iostream>
     3 
     4 //一个自定义的整数类
     5 struct integer{
     6       int i;
     7       integer(int i):i(i){}
     8       void incr_by(int j){ i+=j;}
     9 };
    10 
    11 void mem_func_sample(){
    12      integer x(0);    //x.i=0;
    13      integer *y=&x;   //y指向x
    14      using namespace std::placeholders;
    15      using namespace std;
    16      
    17      auto f0=bind(&integer::incr_by,_1,_2);
    18      f0(x,2);     //x.incr_by(2)
    19      cout<<x.i<<endl;
    20      
    21      f0(y,2);         //y->incr_by(2)
    22      cout<<x.i<<endl;   //x.i=4
    23      
    24      auto f1=bind(&integer::incr_by,x,_1);
    25      f1(2);   //x在f1的副本.incr(2)
    26      cout<<x.i<<endl;  x.i=4;
    27      
    28      auto f2=bind(&integer::ince_by,ref(x),_1);
    29      f2(2);   //x.incr_by(2)
    30      cout<<x.i<<endl;       //x.i=6;
    31      
    32      auto f3=bind(&integer::incr_by,&x,_1);
    33      f3(2);   //(&x)->incr_by(2)
    34      cout<<x.i<<endl;  //x.i=8
    35      
    36      //利用mem_fn将成员函数转换为函数对象
    37      auto f4=mem_fn(&integer::incr_by);
    38      f4(x,2);  
    39      cout<<x.i<<endl;//x.i=10;
    40      f4(y,2);   
    41      cout<<x.i<<endl;//x.i=12
    42      
    43      
    44 }

    上例中用不同的方式为integer类的incr_by成员函数绑定参数.对于所得的函数对象f0,由于bind的首参数与f0的第一个参数相关联,f0将自动以integer为首参数类型,所以f0(x,2)实际调用了x.incr_by(2),使得x的i值增加2;另外f0也自动支持integr指针,所以调用f0(y,2)相等于执行了y->incr_by(2),同样使得x的i值增加2。而f1的调用是x在f1内的副本,不会影响x的状态.只有如f2或f3那样绑定x才会真正调用x的成员函数.

  • 相关阅读:
    Maximum of lines in a DataBand
    "New page after" by code
    How to show out three rows from the same databand On A4?
    Asp.Net Core 第07局:路由
    Asp.Net Core 第06局:中间件
    Asp.Net Core 第05局:读取配置
    Asp.Net Core 第04局:依赖注入
    POJ-1003
    ORACLE 存储过程实例 [备忘录]
    关于操作有符号数的溢出问题
  • 原文地址:https://www.cnblogs.com/sixue/p/4013766.html
Copyright © 2011-2022 走看看