std::function是如何使指向成员函数的指针工作的

How does std::function makes pointer pointing to a member function work?

本文关键字:函数 工作 成员 指针 何使指 function std      更新时间:2023-10-16

更新:在某种程度上与stdfunction如何实现有关

该程序将不同的函数指针(结构中的乘法、函数中的除法和lambda中的加法(插入到向量中,然后调用具有相同参数的元素。问题只出现在结构中。

它与std::函数配合得很好,但在使用函数指针时,我无法使它编译。有人知道如何修复程序吗;或者更好的是,std::函数是如何工作的?如果我改为使用静态成员函数,程序就会变得琐碎(下面不包括(。

#include <iostream>
#include <string>
#include <vector>
#include <functional>
struct mult {
double operator()(double a, double b) { return a * b; }
double fun(double a, double b) { return a * b; }
};
double add(double a, double b) {
return a + b;
}
using namespace std;
int main(){
using fnc = function<double(double, double)>;
vector<fnc> functions;
functions.push_back(mult{});
functions.push_back([](double a, double b) {return a / b; });
functions.push_back(add);
double a = 3, b = 4;
cout << "a=" << a << ", b=" << b << endl;
for (int i = 0; i < 3; ++i)
cout << functions[i](a, b) << endl;
cout << endl;
typedef double (*fp)(double, double);
fp funPtr;
vector<fp> functions1;
//functions1.push_back(mult{}); error
typedef double (mult::*mfp)(double, double);
mfp f = &mult::fun;
mult * obj = new mult;
cout << (obj->*f)(3, 4) << endl;//          OK!
//functions1.push_back(mfp);        ERROR!
//functions1.push_back(obj->*f);    ERROR!
//functions1.push_back(&mult::fun); ERROR!
functions1.push_back([](double a, double b) {return a / b; });
functions1.push_back(add);
for (int i = 0; i < 2; ++i)
cout << functions1[i](a, b) << endl;
std::cout << "npres enter to exit...";
int wait_key = getchar();
return 0;
}

成员函数有一个隐藏的第一个参数,它是指向被调用对象的指针

double mult::operator()(double a, double b) { return a * b; }

实际上(在某种程度上(等于

double operator()(mult* this, double a, double b) {
return a * b;
}

这就是为什么不能将mfp类型的对象添加到fp类型的向量中。

编辑:工作的是

struct mult {
static double fun(double a, double b) { return a * b; }
};
fp f = &mult::fun;
functions1.push_back(f);

通过创建成员函数static,它不再与对象绑定。

functions1.push_back(mfp);

可能是打字错误,因为mfp是typedef,而不是函数对象f。。。

edit 2:还可以选择使用std::bind将第一个隐藏参数绑定到特定对象。

例如,使用您的原始(非静态(成员功能:

mult obj;
fnc temp = std::bind(&mult::fun, &obj, std::placeholders::_1, std::placeholders::_2);
functions.push_back(temp);