C++11中bind,function实战记录

C++11中bind和function的使用

最近在做的项目中有一个需求,我负责向客户端推送一组数据,这些数据需要另一个服务器程序员填充,
我需要调用他的一个函数,并把我的填充函数传递给他,然后在他的函数中填充这些数据.

首先我用普通函数试验了一下,因为c++11中的bind和function并没有使用过太多.
``` c++

#include <stdio.h>
#include <functional>
struct Info;
typedef std::function<Info*()> NewInfo;
typedef std::function<void (int key,int value)> PropExecute;
using namespace std::placeholders;

struct Info
{
    int key;
    int value;
};

void test(PropExecute func)
{
    func(1,1);
}
void prop(int key,int value,NewInfo f)
{
    Info* info = f();
    info->key = key;
    info->value = value;
}
Info* new_info()
{
    return new Info;
}

int main()
{
    test(bind(prop,_1,_2,new_info));
    return 1;
}

这样写就基本实现了该功能,InfoPropExecute函数类型由我公开给服务器同事,
同事提供test函数给我调用,并在该函数内使用我传递过去的函数将数据填充(这里我用1,1填充).

好了,现在修改一下,把所有的普通函数都修改为类成员函数,因为项目中这些函数都是类成员函数.

#include <stdio.h>
#include <functional>
struct Info;
typedef std::function<Info*()> NewInfo;
typedef std::function<void (int key,int value)> PropExecute;
using namespace std::placeholders;
class Attr
{
public:
    Attr():key(1),value(1){}
    ~Attr(){};
    void get_attr(PropExecute func)
    {
        func(key,value);
    }
    int key;
    int value;
};
class Info
{
public:
    Info():key(0),value(0){};
    ~Info(){};
    Info* new_info()
    {
        return new Info;
    }
    int key;
    int value;
};
class MyClass
{
public:
    MyClass(){}
    ~MyClass(){}
    void set_prop(int key,int value,NewInfo f)
    {
        Info* info = f();
        info->key = key;
        info->value = value;
    }
};


int main()
{
    Info info;
    Attr attr;
    MyClass myclass;
    NewInfo newinfo = std::bind(&Info::new_info,&info);
    attr.get_attr(bind(&MyClass::set_prop,&myclass,_1,_2,newinfo));
    return 1;
}

修改为类成员函数后就是这样了,这里遇到一个问题,main函数中调用get_attr时分成了两条代码,
因为写成这样编译报错attr.get_attr(bind(&MyClass::set_prop,&myclass,_1,_2,std::bind(&Info::new_info,&info)));
我估计可能是类型不匹配之类的错误.总之分成两条代码就OK了.