概述
在c++中,使用std::function和std::bind来代替函数指针。
一、贴上类和函数
#include <iostream>
#include <functional>
using namespace std;
class MyClass
{
public:
void myfunc()
{
cout << "myfunc" << endl;
}
static void staticFunc()
{
cout << "staticFunc" << endl;
}
};
void func()
{
cout << "func" << endl;
}
void argsFunc(int i,char c,float f)
{
printf("i=%d,c=%c,f=%f n",i,c,f);
}
二、使用函数指针
//定义函数指针,并且指向了func函数的地址
void(*ptr)();
ptr = &func;
ptr();
在面向过程的c语言中,是这样使用函数指针的,c++中也是可以这样写。但是,由于c++是面向对象,所以出现了对象的方式来代替函数指针。
三、由于c++面向对象,所以使用std::function来代替。
std::function<void()> f = func;
f();
此处,通过使用std:function这样的模板来代替函数指针。
std::function<void()> staticF = MyClass::staticFunc;
staticF();
std::function能够绑定类的静态成员,和全局函数。但是,它不能绑定类的非静态成员,否则不能通过编译。
std::function<void()> func = MyClass::myfunc;//这种写法会报错
func();
那么,要绑定类的非静态成员函数,需要使用std::bind。
六、使用std::bind()来绑定类的非静态成员函数
MyClass myCls;
std::function<void()> func = std::bind(&MyClass::myfunc, myCls);
func();
std::function调用类的非静态成员函数,需要提供一个类的对象,这里创建了一个MyClass 的栈对象myCls,提供给std::bind。
std::function<void(char, float, int)> func = std::bind(argsFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1);
func('a', 0.01f, 10);
std::bind可以改变参数的顺序,看起来容易造成混乱。void(char, float, int) 中的char,float,int和参数std::placeholders::_2, std::placeholders::_3, std::placeholders::_1按顺序对应,但在实际函数argsFunc(int i,char c,float f)中实际参数按从左到右,对应std::placeholders::_1,std::placeholders::_2,std::placeholders::_2。此处容易造成混淆。
最后
以上就是勤劳彩虹为你收集整理的std::function和std::bind的使用(总结)的全部内容,希望文章能够帮你解决std::function和std::bind的使用(总结)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复