版权声明:转载请注明出处 https://blog.csdn.net/weixin_40937100/article/details/88785249
2.8 boost::function
boost::function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛化,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。因此,它可以被用于回调机制,暂时保管函数或函数对象,在之后需要的时机在调用,使回调机制拥有更多的弹性。
0.回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
附加:c/c++中函数指针在普通函数和类成员函数的使用:
这里的代码还没有看懂,标记一下,继续学习。
#include <iostream>
using namespace std;
class CEventQuery;
typedef bool (*CommonFuncPoint)(void); //普通函数指针
typedef bool (CEventQuery::*ClassFuncPoint)(int); //类成员函数指针
bool CommonFunc(void)
{
//这是个回调函数,当特定的事件或条件发生
//的时候,会被调用。
cout << "CallBackFunc Common Function Call!" << endl;
//这里会有特定事件或条件发生时需要处理的事
//....
return true;
}
class CEventQuery
{
public:
CEventQuery(CommonFuncPoint eventFunc)
:m_Event(eventFunc)
{
}
~CEventQuery()
{
}
void Query(void)
{
//这里会检测某个事件或条件的发生
//比方说这里查询到了事件发生或条件的改变,那么就回调处理函数
m_Event();
}
bool DoSomething(int iValue)
{
cout << "Class Function DoSomething Parament : " << iValue << endl;
return true;
}
private:
CommonFuncPoint m_Event;
};
int main(void)
{
CEventQuery tEventQuery(CommonFunc);
tEventQuery.Query();
ClassFuncPoint ClassFunc1 = &CEventQuery::DoSomething;
(tEventQuery.*ClassFunc1)(10);
tEventQuery.DoSomething(20);
return 0;
}
后面还有很多精彩的内容,包括boost::function的首选语法和便携式语法,详见这个连接
回调函数的一个用例:一个链表用来记录一组数据,最大能记录400条记录,这400条数据能根据用户的选择(支持编号(int),距离(float)进行排序)进行排序显示。为了使排序算法更为通用,可使用回调函数。
1.普通用法——函数对象调用
#include<iostream>
#include<thread>
using namespace std;
int fsum(int i, int j)
{
return i + j;
}
int main(){
boost::function<int(int, int)> func1;
func1 = fsum;
std::cout << "4 + 5 = " << func1(4, 5) << std::endl;
}
2.普通用法——类对象调用(构造函数)
class Person
{
public:
void operator() (std::string name, int age)
{
std::cout << name << ": " << age << std::endl;
}
};
int main(){
boost::function<void(std::string, int)> func2;
Person person;
func2 = person;
func2("myname", 30);
}
3.普通用法——类成员函数
class Car
{
public:
Car(){}
virtual ~Car(){}
void info(int i)
{
std::cout << "info = " << i << std::endl;
}
};
int main(){
boost::function<void(Car*, int)> func3;
func3 = &Car::info;
Car car;
func3(&car, 25);
}
4.重点用法——空函数
boost::function<int(int, int)> func4;
assert(func4.empty());
assert(!func1.empty());
func1.clear();
assert(func1.empty());
try
{
func1(4, 5);
}
catch (std::exception& e)
{
std::cout << e.what() << std::endl;
}
下面是一些原链接中的c++经典内容