[c++]智能指针——boost::function

版权声明:转载请注明出处 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++经典内容

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40937100/article/details/88785249