C++11新特性之std::function & std::bind

std::function

在c++98&03时我们通常使用回调函数来处理一些需要某种场景下才触发的回调操作,但回调函数有一个限制就是它只能赋值给同类型的全局或者静态函数,对于其他有相同的返回值和相同类型参数的成员函数不能赋值。

#include 
using namespace std;

//define a callback func
typedef void(*CALL_BACK)(void);

//global func
void show(void)
{
	cout << "show global func" << endl;
}

class A
{
public:
	//member func
	void show_class_num(void ){ cout << "show member func" << endl; }

	//static member func
	static void show_class_num_static(void ){ cout << "show static member func" << endl; }
};

int main()
{
	CALL_BACK call;
	//assign a global func to callback func
	call = show;
	call();
	//error 
	call = A::show_class_num;

	//assign a static member func
	call = A::show_class_num_static;
	call();
	return 0;
}
在了解C++11中引入的std::function前,首先我们需要了解C++中有关可调用实体(callable target)的相关概念,C++中包含了几种可调用对象:函数,函数指针,lambda表达式,std::bind创建的对象,以及重载了()操作符的类。函数以及函数指针这个就不用介绍了,有关lambda表达式也是C++11引入的一个新特性,就地创建匿名表达式,读者可以参阅相关介绍lambda的文章,我后续也会写一篇关于lambda的详解,这个需要说的是重载了操作符()的类也称为可调用对象。

// 仿函数(functor)
class Functor
{
public:
    int operator()(int a)
    {
        return a;
    }
}
这个类也称为仿函数类。

C++11中引入了std::funtion这个模板类,这个模板类是一个多用途的函数包裹器,std::function的实例可以存储,拷贝和调用任何的可调用实体,包括全局函数,成员函数,lambda表达式和仿函数以及std::bind绑定的对象,甚至是成员变量,std::function统一和简化了相同类型可调用实体的使用方式,使得编码变得更简单。

std::function的原型:

template< class R, class... Args >
class function<R(Args...)>
R是返回值类型,Args是函数的参数类型,实例一个std::function对象很简单,就是将可调用对象的返回值类型和参数类型作为模板参数传递给std::function模板类。比如:

std::function f1;

std::function f2;

std::function的使用

#include 
#include 

using namespace std;

std::function func;

int testFunc()
{
	cout << "global Func" << endl;
	return 0;
}

auto lambda = [](void) -> int {cout << "lambda func" << endl; return 0; };

class Func
{

	int operator()(void)
	{
		cout << "仿函数" << endl;
		return 0;
	}
};


class CFuntion
{
public:
	int ClassMember(){ cout << "class member function" << endl; return 0; }
	int static StaticClassFunc(){ cout << "static class member function" << endl; return 0; }
};
int main()
{
	func = testFunc;
	func();

	func = lambda;
	func();

	func = CFuntion::StaticClassFunc;
	func();

	CFuntion classFunc;
	func = std::bind(&CFuntion::ClassMember, classFunc);
	func();

	return 0;
}
可见std::function的使用其实是很简单的,只要创建一个模板类对象,病传入相应的模板参数就可以存储任何具有相同返回值和参数的可调用对象,在调用的时候直接将std::function对象加上()就可以调用存储在其中的可调用实体,需要注意的是创建的std::function对象中存储的可调用实体不能为空,若对空的std::function进行调用将抛出   std::bad_function_异常。


你可能感兴趣的:(C++11新特性)