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的成员函数.

  • 相关阅读:
    docker 安装mysql
    Java web项目搭建系列之二 Jetty下运行项目
    Java web项目搭建系列之一 Eclipse中新建Maven项目
    Maven 添加其他Maven组件配置问题
    C# 中定义扩展方法
    Oracle 函数
    【Webservice】2 counts of IllegalAnnotationExceptions Two classes have the same XML type name
    Linux精简版系统安装网络配置问题解决
    Rsync 故障排查整理
    Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.
  • 原文地址:https://www.cnblogs.com/sixue/p/4013766.html
Copyright © 2011-2022 走看看