C++11 FAQ中文版:std::function 和 std::bind

std::function 和 std::bind

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

        int f(int, char, double);// 绑定f()函数调用的第二个和第三个参数,// 返回一个新的函数对象为ff,它只带有一个int类型的参数auto ff = bind(f, _1, ‘c’, 1.2);int x = ff(7);                //  f(7, ‘c’, 1.2);

参数的绑定通常称为”Currying”(译注:Currying—“烹制咖喱烧菜”,此处意指对函数或函数对象进行加工修饰操作), “_1″是一个占位符对象,用于表示当函数f通过函数ff进行调用时,函数ff的第一个参数在函数f的参数列表中的位置。第一个参数称为”_1″, 第二个参数为”_2″,依此类推。例如:

        int f(int, char, double);auto frev = bind(f, _3, _2, _1);        // 翻转参数顺序int x = frev(1.2, ‘c’, 7);            // f(7, ‘c’, 1.2);

此处,auto关键字节约了我们去推断bind返回的结果类型的工作。

我们无法使用bind()绑定一个重载函数的参数,我们必须显式地指出需要绑定的重载函数的版本:

        int g(int);double g(double);auto g1 = bind(g, _1);    // 错误:调用哪一个g() ?// 正确,但是相当丑陋auto g2 = bind( (double(*)(double))g, _1);

bind()有两种版本:一个如上所述,另一个则是“历史遗留”的版本:你可以显式地描述返回类型。例如:

        auto f2 = bind<int> (f, 7, ‘c’, _1);      // 显式返回类型int x = f2(1.2);                    // f(7, ‘c’, 1.2);

第二种形式的存在是必要的,并且因为第一个版本((?) “and for a user simplest “,此处请参考原文))无法在C++98中实现。所以第二个版本已经被广泛使用。

function是一个拥有任何可以以”(…)”符号进行调用的值的类型。特别地,bind的返回结果可以赋值给function类型。function十分易于使用。(译注:更直观地,可以把function看成是一种表示函数的数据类型,就像函数对象一样。只不过普通的数据类型表示的是数据,function表示的是函数这个抽象概念。)例如:

        // 构造一个函数对象,// 它能表示的是一个返回值为float,// 两个参数为int,int的函数function<float (int x, int y)> f;   // 构造一个可以使用"()"进行调用的函数对象类型struct int_div {float operator() (int x, int y) const{ return ((float)x)/y; };};f = int_div();                    // 赋值cout<< f(5,3) <<endl;  // 通过函数对象进行调用std::accumulate(b, e, 1, f);        // 完美传递

成员函数可被看做是带有额外参数的自由函数:

        struct X {int foo(int);};// 所谓的额外参数,// 就是成员函数默认的第一个参数,// 也就是指向调用成员函数的对象的this指针function<int (X*, int)> f;f = &X::foo;            // 指向成员函数X x;int v = f(&x, 5);  // 在对象x上用参数5调用X::foo()function<int (int)> ff = std::bind(f, &x, _1);    // f的第一个参数是&xv = ff(5);                // 调用x.foo(5)

function对于回调函数、将操作作为参数传递等十分有用。它可以看做是C++98标准库中函数对象mem_fun_t, pointer_to_unary_function等的替代品。同样的,bind()也可以被看做是bind1st()和bind2nd()的替代品,当然比他们更强大更灵活。

参考:

  • Standard: 20.7.12 Function template bind, 20.7.16.2 Class template function
  • Herb Sutter:Generalized Function Pointers
    .
    August 2003.
  • Douglas Gregor:
    Boost.Function
    .
  • Boost::bind

(翻译:dabaitu)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 习题(面向对象)

1.&#xff08;面向对象基础&#xff09;写一个Worker 类&#xff0c;并创建多个Worker 对象。 为Worker 类添加四个属性&#xff0c; <1>int 类型的id&#xff0c;表示工人的编号&#xff1b; <2>String 类型的name&#xff0c;表示工人的姓名&#xff1b; <3…

机器学习笔记(2):单变量线性回归

目录 1&#xff09;Model representation 2&#xff09;Cost function 3&#xff09;Cost function intuition 1 4&#xff09;Cost function intuition2 5&#xff09;Gradient descent 6&#xff09;Gradient descent intuition 7&#xff09;Gradient descent for li…

指针右左法则----复杂指针解析

其实如果写得出&#xff08;其实不难&#xff09;指针和数组的声明的EBNF的话&#xff0c;那么直接看就可以反应过来了…… 右左法则是一个既著名又常用的方法。不过&#xff0c;右左法则其实并不是C标准里面的内容&#xff0c;它是从C标准的声明规定中归纳出来的方法。C标准的…

【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

题干&#xff1a; 网络管理员管理大型网络。该网络由N台计算机和成对计算机之间的M链路组成。任何一对计算机都通过连续的链接直接或间接连接&#xff0c;因此可以在任何两台计算机之间转换数据。管理员发现某些链接对网络至关重要&#xff0c;因为任何一个链接的故障都可能导…

安装VMware tools

点击“虚拟机” 安装VMware tools提取图中文件到“下载” 提取登入root 进入 cd 下载/vmware-tools-distrib 执行 ./vmware-install-pl 输入yes或者点击“enter”出现图中&#xff0c;即为成功安装

Keras入门实战(1):MNIST手写数字分类

目录 1)首先我们加载Keras中的数据集 2&#xff09;网络架构 3&#xff09;选择编译(compile参数) 4&#xff09;准备图像数据 5) 训练模型 6&#xff09;测试数据 前面的博客中已经介绍了如何在Ubuntu下安装Keras深度学习框架。 现在我们使用 Keras 库来学习手写数字分…

什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF

什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF 什么是巴科斯范式&#xff1f;   巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。   现在&…

root 进入ssh 出现问题

用root输入下面命令&#xff0c;一直让输入密码&#xff0c;并提示错误 ssh localhost那是因为系统默认禁止root用户登录ssh 首先&#xff0c;CtrlC退出密码输入界面&#xff1a;然后输入&#xff1a;su - 然后&#xff0c;编辑sshd_config文件&#xff0c;输入&#xff1a;…

【BZOJ - 2574】[Poi1999] Store-Keeper(点双连通分量,求割点,记忆化bfs)

题干&#xff1a; 有一个仓库被分成n*m 个矩形区域&#xff0c;如果两个区域有一条公共边&#xff0c;则被认为这两个区域相邻。包裹都放在一个区域中&#xff0c;剩余的区域或者空闲或者被集装箱占有&#xff0c;这是因为集装箱太重&#xff0c;仓库管理员不能将集装箱搬走。…

机器学习笔记(3):线性代数回顾

目录 1&#xff09;Matrices and vectors 2&#xff09;Addition and scalar multiplication 3&#xff09;Matrix-vector multiplication 4&#xff09;Matrix-matrix multiplication 5&#xff09;Matrix multiplication properties 6&#xff09;Inverse and transpos…

hadoop 安装

Hadoop单机和伪分布式安装 更新apt 用root用户登录 先更新一下 apt apt-get update然后安装vim apt-get install vim安装VMware tools tools 安装 安装SSH、配置SSH无密码登陆 单节点模式都需要用到 SSH 登陆&#xff0c;Ubuntu 默认已安装了 SSH client&#xff0c;此…

机器学习笔记(4):多变量线性回归

目录 1&#xff09;Multiple Features 2&#xff09;Gradient descent for multiple variables 3&#xff09;Gradient descent in practice 1: Feature Scaling 4&#xff09;Gradient descent in pratice2: Learning rate 5&#xff09;Features and polynomial regress…

【POJ - 2942】Knights of the Round Table(点双连通分量,二分图判断奇环奇圈)

题干&#xff1a; Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, and drinking with the other knights are fun things to do. Therefore, it is not very surprising that in recent years the kingdom of King …

zookeeper单节点部署

hadoop 安装 在/install-package目录下查看zookeeper的安装包 本文中安装的是zookeeper-3.4.12.tar.gz 下方为百度云链接 链接&#xff1a;https://pan.baidu.com/s/1bzq4ILH41owtS__3tBCcRQ 提取码&#xff1a;6q4r 把下载好的zookeeper-3.4.12.tar.gz 放到/install-packa…

机器学习笔记(五):逻辑回归

目录 1&#xff09;Classification 2&#xff09;Hypothesis Representation 3&#xff09;Decision boundary 4&#xff09;Cost function 5&#xff09;Simplified cost function and gradient descent 6&#xff09;Multi-class classification:One-vs-all 7&#xf…

xrdp完美实现Windows远程访问Ubuntu 16.04

前言&#xff1a; 在很多场景下&#xff0c;我们需要远程连接到Linux服务器(本文是Ubuntu)&#xff0c;传统的连接主要分为两种。 第一种&#xff1a;通过SSH服务&#xff08;使用xshell等工具&#xff09;来远程访问&#xff0c;编写终端命令&#xff0c;不过这个是无界面的&a…

【HDU - 6203】ping ping ping(lca+贪心思想,对lca排序,树状数组差分)

题干&#xff1a; 给出一个n1个点的树&#xff0c;以及p个点对&#xff0c;需要断开一些点&#xff0c;使得这p个点对路径不连通。输出应该断开的最少点数。 解题报告&#xff1a; 从那p个点对入手的话&#xff1a;首先考虑只有一对点的话&#xff0c;肯定是这条路径上的随便…

机器学习笔记(六):正则化

目录 1&#xff09;The problem of overfitting 2&#xff09;Cost function 3&#xff09;Regularized linear regression 4&#xff09;Regularized logistic regression 我们已经学习了线性回归和逻辑回归算法&#xff0c;已经可以有效解决很多问题&#xff0c;但是在实…

Hbase单节点安装

zookeeper单节点部署 实验环境 操作系统&#xff1a;Ubuntu 16.04 Hadoop&#xff1a;Hadoop 2.7.5 Zookeeper&#xff1a;zookeeper 3.4.12 Java&#xff1a;java version 1.8.0 到/install-package目录下查看hbase安装包 #>ls /install-package本文中用的是hbase-1…

ROS 常用命令字典

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请标明出处: http://www.cnblogs.com/liu-fa/p/5761448.html 该博文适合已经具备一定的ROS编程基础的人&#xff0c;快速查看ROS相关指令。 本文持续更新中&#xff0c;望关注收藏&#xff0c;一起改进... 创建 ROS 工作…