函数指针、std::function、std::bind
函数指针、std::function、std::bind
函数指针:
-
C++语法中可以直接将函数名作为指针,
void fun(int a, int b);
在这个函数声明中,函数指针即为
fun
,传入要被调用的地方时只需要传入fun
就可以。但是这个函数指针是什么类型呢?需要明确函数指针类型及其写法,我们才能在要调用函数的形参处正确说明此处参数是一个函数指针的意图。对于上述的函数指针类型为:
void(int, int)
.即需要以函数的返回值,函数形参类型组合来指定一个函数类型,就像是指定一个整型变量或者浮点型变量。整体赋值语句为:
void(*fp)(int, int) = fun
.fp指针上就被赋予了fun函数的代码起始地址,注意由于优先级*较低,如果不加括号,编译器就会将void*连在一起,意思是返回空指针了。 -
函数指针调用:
void callback(void(*fp)(int, int) ){ fp(1,2); (*fp)(1,2); }
这两种调用写法都是对的(虽然理论上应该是第二种写法)
std::function
std::function
实现了与函数指针类似的功能,将函数包装成了一个可调用对象,用法与函数指针一样。
std::function<void(int, int)> fp = fun;
赋值语句整体与上述相同,但是它将函数指针完全分离成了一个可以视作类型的东西,可以想想std::function<void(int, int)>
其实就是类比自定义的类名className
整体来看更加清晰,在调用时,也完全可以把它作为一个对象来调用,函数参数可以类比为类的构造参数。如:fp(1, 2)
In less abstruse English, it means that
std::function
can contain almost any object that acts like a function pointer in how you call it.
为了简单的表示:以上赋值语句也可以分为两句:
using myName = std::function<void(int, int)>
myName fp = fun;
std::bind
作用是绑定函数与参数,返回function对象,就类似于给定一个默认值,比如对于上面的有两个int参数的函数:
std::function<void(int, int)> fp = std::bind(fun, std::place_holder::_1, std::place_holder::_2);
std::function<void(int)> fp = std::bind(fun, 1, std::place_holder::_1);
std::function<void()> fp = std::bind(fun, 1, 1);
注意,随着绑定参数个数的不同,返回值的类型也不同。
此外,bind也可以用于类外访问类内的私有函数,可以防止直接暴露给外界: