C++ function中存类的成员函数的坑点

有误的!
就不该用函数指针指向类的成员函数,除非是类的静态成员函数。

问题代码:

#include<functional>

class A {
public:
	int data;
	void fun1(int i) {
		data += i;
	}
	void fun2() {
		std::function<void(int)> temp = fun1;
	}
};

报错内容:
不存在从"void(int i)" 转换到 “std::function<void(int)>” 的适当构造函数。
这个报错很令人迷惑,这不俩类型一样?
后查阅资料发现,每一个类的成员函数都会被隐式的传递一个this指针,fun1的真实类型应该为:

//void fun1(int i);
void fun1(A* this,int i);

所以我们应该修改function的类型,最终代码为:

#include<functional>

class A {
public:
	int data;
	void fun1(int i) {
		data += i;
	}
	void fun2() {
		//此处进行了修改
		std::function<void(A*,int)> temp = fun1;
	}
};

后来,我的朋友又教了我一种更好用的方法,使用了C++11新标准的decltype关键字,如下:

void fun2() {
	std::function<void(decltype(this),int)> temp = fun1;
}

版权声明:本文为qingsui9原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。