一、官方解释 :
std::function:是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,她可以用统一的方式处理函数、函数指针、函数对象,并能保存和延迟他们的执行
std::function:接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表.
自己理解:function和bind一般在用处比较多的地方就是,注册函数回调。在A类中function保存具体的函数指针,B类注册这个函数回调,当A类回调的时候,B类bind绑定类一个方法执行具体的回调任务。
二、代码例子
class AudioRecorder
{
public:
AudioRecorder();
~AudioRecorder();
void setAudioWriteListener(AudioWriteLitener listener) {
std::unique_lock<std::mutex> lock{mMutex};
mAudioWriteLisener = listener;
}
private:
typedef std::function<void(void*,int,bool,bool)> AudioWriteLitener;
AudioWriteLitener mAudioWriteLisener;
private:
void notifyAudioData(void* buffer,int len,bool vadSts,bool isFirstFrame) {
std::unique_lock<std::mutex> lock{mMutex};
if (mAudioWriteLisener != nullptr) {
mAudioWriteLisener(buffer,len,vadSts,isFirstFrame);
}
}
};
class Manager {
public:
virtual ~Manager() {
if(null != mAudioRecorder) {
mAudioRecorder = null
}
}
Manager():mAudioRecorder(std::make_shared<AudioRecorder>()) {
}
void init() {
if (null != mAudioRecorder) {
// 当 Audiowrite类中调用notifyAudioData通知的时候就会执行到 Manager 类中的 audioWrite()方法
mAudioRecorder->setAudioWriteListener(std::bind(&Manager::audioWrite,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4));
}
}
void audioWirte(void *pcmData, long unsigned int pcmLen,bool vadSts,bool isFirstFrame) {
// do something
}
private:
std::shared_ptr<AudioRecorder> mAudioRecorder;
};