C++11的function bind回调机制

#include <functional>

using namespace std::placeholders;

1.可以提前声明函数类型:function< 返回值 ( 参数列表) >  函数名;

function< int (int, double, string) > fn

也可以不用声明类型直接bind前面:auto fn = bind(  ....)

函数参数的对应:

以实际函数的参数对应声明的位置:

int test(double, string, int)

fn = bind(test, _2, _3, _1)  -->test参数的第一个类型double,对应于function的_2位置,

也可设置常量参数,fn = bind(test, 3.5, "hello", 6);

2.bind类的成员函数时:

bind(&A::print, &a, ...)

#include <iostream>
#include <string>
#include <functional>
using namespace std;
using namespace std::placeholders;

void test(int i, double d, const string &s)
{
    cout << "i= " << i << " d= " << d <<" s= " << s << endl;
}
int test1(int i, double d, const string &s)
{
    cout << "i= " << i << " d= " << d <<" s= " << s << endl;
    return i;
}

int main(int argc, const char *argv[])
{
    function<void( void )> fp;
    string s = "foo";
    int a = 3;
    double b = 6.7;
    fp = bind(&test, a, b, s);
    fp();

    function <void (int , const string&)> fp1;
    double b2 = 4.6;
    fp1 = bind(test, _1, b2, _2);
    fp1(4, "kity");

    function <int (int , const string&) > fp2;
    fp2 = bind<int>(test1, _1, b2, _2);
    int  y = fp2(4, "kity");
    cout << y << endl;

    auto fn = bind(test, 10, 23.3, "heko");//不用function指定函数参数,
    fn();

    auto ff = bind(test, _1, _3, _2);//bind中的i参数类型与test的_j的参数类型对应
    ff(12, "ppp", 12.5);

    class A
    {
        public:
            void print(int a, double x)
            {
                cout << a << " " << x << endl;
            }
    };
    A a3;
    auto fclass= bind(&A::print, &a3, 11, 7.7);
    fclass();
    return 0;
}
时间: 2024-12-19 04:36:45

C++11的function bind回调机制的相关文章

使用C++11的function/bind组件封装Thread以及回调函数的使用

之前在http://www.cnblogs.com/inevermore/p/4008572.html中采用面向对象的方式,封装了Posix的线程,那里采用的是虚函数+继承的方式,用户通过重写Thread基类的run方法,传入自己的用户逻辑.   现在我们采用C++11的function,将函数作为Thread类的成员,用户只需要将function对象传入线程即可,所以Thread的声明中,应该含有一个function成员变量. 类的声明如下: #ifndef THREAD_H_ #define

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++0x(四) —- function, bind和lambda

实在是觉得此文总是去翻感觉不太好.于是果断转过来了,想看原文的请戳:http://www.wuzesheng.com/?p=2032 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解.在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础.下面我们来看看wikipedia上对于计算机领域的closu

C++ function/bind

function/bind 1. std::function i.  是一个函数的包装器 ii. std::function<R(T1, T2, ..., TN)> iii. 这是一个模板实现的函数对象类,它可以包装其它任意的函数对象,而被包装的函数对象具有类型为T1,T2,…,TN的参数,其返回值为R类型 iv. function 对象的最大用处在于实现函数回调 2. bind i.   bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体(可

C++回调机制实现 signal-slot

什么是回调?通常发生在需要两个角色即调用者与实现者的情形上,即我们希望当产生某个事件时,调用实现者定义的某个函数.当然这个概念很大,不是说操作系统的信号量,条件变量什么的,是在语言级别实现,如一个Framework提供商,规定了整个程序的框架,可能产生某事件时它希望调用某个行为,而这个行为的具体定义是由framework客户来完成. 我们从简单的做起,通过一个个为什么最终来获得一个比较好的回调实现. C语言中用全局函数实现回调最简单了: void callback(int a){    cout

function/bind的救赎(上)

这是那篇C++0X的正文.太长,先写上半部分发了. Function/bind可以是一个很简单的话题,因为它其实不过就是一个泛型的函数指针.但是如果那么来谈,就没意思了,也犯不上写这篇东西.在我看来,这个事情要讲的话,就应该讲透,讲到回调(callback).代理(delegate).信号(signal)和消息传递(messaging)的层面,因为它确实是太重要了.这个话题不但与面向对象的核心思想密切相关,而且是面向对象两大流派之间交锋的中心.围绕这个问题的思考和争论,几乎把20年来所有主流的编

C++ TR1 Function Bind

在C++ 11出现以前,C++的事件一般是通过回调形试来实现,如 void (*func)(int,int,int),其实际上是一种函数指针,在C中调用时是直接写函数名在参数列表中,而在C++中,大部份的回调需要定义成 static.也就是静态函数.通过::作用域符,方式调用. 当然在C++TR11出现前,更早的function 与Bind 在开源库中boost 中就有,而C++11 tr1也就是借鉴了或者直接使用了boost库中的相关模板. 现在就来说说C++ tr1 中的Function 模

异步消息的传递-回调机制

简介: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知.同步

JAVA回调机制(CallBack)详解

序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上写一个式子 “1