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;
}
这样写就基本实现了该功能,Info
和PropExecute
函数类型由我公开给服务器同事,
同事提供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了.