我是靠谱客的博主 勤劳彩虹,最近开发中收集的这篇文章主要介绍std::function和std::bind的使用(总结),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在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绑定类的静态成员

std::function<void()> staticF = MyClass::staticFunc;
staticF();

std::function能够绑定类的静态成员,和全局函数。但是,它不能绑定类的非静态成员,否则不能通过编译。


五、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::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的使用(总结)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部