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

时间: 2024-08-14 03:45:37

c++11-bind的用法的相关文章

C++11中function和bind的用法示例

环境Visual Studio 2012,具体代码如下 #include <iostream> #include <functional> #include <string> void PrintNumber(int num) { std::cout << num << std::endl; } struct Printer { void Print(std::string print_str) { std::cout << prin

C++11 std::function用法(c++常问问题十七)

C++11 std::function用法 直接上代码: 例子1:std::function的感觉就像是函数指针那样有木有 #include <iostream> #include <functional> #include <map> using namespace std; // 普通函数 int add(int i, int j) { return i + j; } //lambda表达式 auto mod = [](int i, int j){return i

C++标准 bind函数用法与C#简单实现

在看C++标准程序库书中,看到bind1st,bind2nd及bind的用法,当时就有一种熟悉感,仔细想了下,是F#里提到的柯里化.下面是维基百科的解释:在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 下面来看一个简单的例子. void mult(int& a, int b) { cout << "a:" <&

js中call、apply、bind的用法

今天看博客时,看到了这样的一段js代码: var bind = Function.prototype.call.bind(Function.prototype.bind); 我想突然看到这样的一段代码,即使js能力再强的人,可能也需要花点时间去理解.像我这样的菜鸟就更不用说了.其实,原文已经对这端代码做出了解释,但我还是想用我的想法去解释这段代码. 上面那段代码涉及到了call.bind,所以我想先区别一下call.apply.bind的用法.这三个方法的用法非常相似,将函数绑定到上下文中,即用

jQuery的bind()方法用法详解

bind()方法用法详解: 此方法是使用比较频繁的方法之一,虽然在API手册上有着对方法的介绍,但是由于语言简短,例子不够详细,可能会造成不能够完全准确的掌握bind()方法的使用,下面就结合实例介绍一下此方法的使用. 语法格式: $(selector).bind(type,[data],function(eventObject)) 此方法可以为所有匹配元素的特定事件绑定事件处理函数,例如: <!DOCTYPE html> <html> <head> <meta

call、apply、bind的用法

数组追加 //用apply拼接 var arr1=[12,'name:foo',2048]; var arr2=['Joe','Hello']; Array.prototype.push.apply(arr1,arr2); console.log(arr1);//(5) [12, "name:foo", 2048, "Joe", "Hello"] //用call拼接 var arr1=[12,'name:foo',2048]; var arr2=

c++11: bind用法

原型: template< class R, class F, class... Args > bind( F&& f, Args&&... args ); bind函数模板的作用是: The function template bind generates a forwarding call wrapper for f. Calling this wrapper is equivalent to invoking f with some of its argu

call,apply,bind的用法

关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用不成.可是你非打这个电话不可,于是你可以去借一下朋友的手机,或者借用一下邻居的手机,或者公用电话,这样呢,你就可以在自己没有手机可

javascript中call,apply,bind的用法对比分析

这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用

c++ 11 bind function

Year 2011陈 良乔C++11 FAQ std::function 和 std::bind 标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理函数及函数参数.bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象.(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的.)例如: int f(int, char,