C++11 bind的初步了解

bind是一个C++11的一个标准库函数,它的定义在functional中。可以将bind看作一个通用的函数适配器,他接受一个可调用的对象,生成一个新的可调用对象来‘适应对象参数列表。

调用bind的一般形式为:

auto newCallable = bind(callale,arg_list);

其中,newCallable本身是一个可调用的对象,arg_list是一个逗号分割的参数列表,对应给定的callable的参数。即,当我们调用newCallalbe的时候,会调用callable,并传递给它arg_list中的参数。

arg_list中的参数可能保护形式如_n的名字,其中n是一个整数。这些参数是“占位符“,表示newCallable,他们占据了传递给newCallable的参数的位置。数值n表示生成的可调用对象中的参数位置:_1为newCallable的第一个参数,_2为第二个以此类推。

说这么多可能你获取有些迷惑,不急我们来看看几段简单的代码演示,然后再返回来看看说明,一切你就懂了。

#include <iostream>
using namespace std;

#include <functional>//使用bind引用的头文件
using namespace placeholders;//使用bind命名空间

void fun(int a=0,int b=0,int c=0,int d=0,int e=0)
{
    cout<<"a="<<a<<endl
        <<"b="<<b<<endl
        <<"c="<<c<<endl
        <<"d="<<d<<endl
        <<"e="<<e<<endl
        <<"a+b+c+d+e="<<a+b+c+d+e<<endl;
}

void main(void)
{
    int a=1,
        b=2,
        c=3,
        d=4,
        e=5;

    auto g2=bind(fun,a,b,_1,d,_2);
    //bind的第一个参数为要绑定的函数,后面的参数个数为被绑定函数本身参数的个数
    g2(6,c,e);
    //g2的映射关系为fun(a,b,6,d,c);由于bind参数_1,和_2的限定,g2里面的e没有得到映射。

    /*
    输出结果:
    a=1
    b=2
    c=6
    d=4
    e=3
    a+b+c+d+e=16
    */

    g2(c,e,6,7);
    //g2的映射关系为fun(a,b,c,d,e);由于bind参数_1,和_2的限定,g2里面的6,7没有得到映射。

     /*
    输出结果:
    a=1
    b=2
    c=3
    d=4
    e=5
    a+b+c+d+e=15
    */

    auto g1=bind(fun,a,b,_2,d,_1);
    g1(c,e);
    //将bind里的_1和_2对调,g1的映射为fun(a,b,e,d,c);

     /*
    输出结果:
    a=1
    b=2
    c=5
    d=4
    e=3
    a+b+c+d+e=15
    */

    auto lab=[](char i,char k)
    {
        cout<<"i="<<i<<endl
            <<"k="<<k<<endl;
    };

     auto g3=bind(lab,_5,_3);
     g3('a','b','c','d','e');
      /*
    输出结果:
    i=e
    k=c
    */

     auto g4=bind(lab,_2,_4);
     g4('a','b','c','d','e');
    /*
    输出结果:
    i=b
    k=d
    */ 

    system("pause");
}

时间: 2024-11-09 09:19:43

C++11 bind的初步了解的相关文章

c++ 11 bind function

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

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

C++11 bind

#include <iostream> #include <functional> using namespace std; int func(int a, int b) { return a + b; } class foo { public: int func(int a, int b) { return a + b; } }; int main() { auto bf1 = std::bind(func, 10, std::placeholders::_1); cout<

【shell基础】11、数组初步

一.数组 数组:是一种数据结构, 数据序列,连续的多个数据,可以使用索引获取相关元素 声明数组: declare -a ARRAYNAME  # 可以不事先声明 初始化赋值:    ARRAYNAME=("STRING1" "STRING2"...)   #使用空格隔开    ARRAYNAME=("STRING1" [4]="STRING2"...)    ARRAYNAME[0]="STRING1" A

2018-3-11Linux系统管理(10)(11)程序包初步概念及后端管理工具

本章我们来介绍Linux程序包的概念及安装校验卸载等管理操作. 一.概述 我们不止一遍讲述过操作系统的概念,首先是硬件,计算机它的计算能力都是在硬件设计逻辑上实现的,而这个设计硬件设计逻辑不同厂商所生产的硬件芯片及接口的方式都不一样.那么在向上一层就是将硬件规格给封装起来的操作系统层,它将硬件的差异化和复杂化而由丑陋的接口隐藏起来,向上提供了一个简洁而又统一的接口,我们称之为系统调用(system call),但系统调用仍然很底层,为了加速开发和易于维护,在系统调用的半层接口上又封装了一个更复杂

boost::bind 详解

使用 boost::bind是标准库函数std::bind1st和std::bind2nd的一种泛化形式.其可以支持函数对象.函数.函数指针.成员函数指针,并且绑定任意参数到某个指定值上或者将输入参数传入任意位置. 1. 通过functions和function pointers使用bind 给定如下函数: 1 int f(int a, int b) 2 { 3 return a + b; 4 } 5 6 int g(int a, int b, int c) 7 { 8 return a + b

boost::bind测试代码

// Copyright (c) 2015 // Author: Chrono Law #include <std.hpp> //using namespace std; #include <boost/bind.hpp> using namespace boost; ////////////////////////////////////////// int f(int a, int b)<span style="white-space:pre">

【Win10】UAP/UWP/通用 开发之 x:Bind

[Some information relates to pre-released product which may be substantially modified before it's commercially released. Microsoft makes no warranties, express or implied, with respect to the information provided here.] [涉及某信息预发布的版本可能在它的商业版本大幅修改.对于这里

原生JS:Function对象(apply、call、bind)详解

Function对象(apply.call.bind) 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript) Function 构造器会创建一个新的 Function 对象. 在 JavaScript 中每个函数都是一个Function对象. 构造器 new Function ([arg1[, arg2[, ...argN]],] functionBody) arg1, arg2, .