std::function是如何使指向成员函数的指针工作的
How does std::function makes pointer pointing to a member function work?
更新:在某种程度上与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);
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中的memset函数工作不正常
- 渲染窗口无法跨多个函数工作
- C++:最大数组值函数工作不正常
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 如何让我的构造函数和函数工作,以便我的 main() 能够同时显示字符串和 int 数据
- (c++)无法让 void 函数工作,主.cpp内部的几行也有问题
- 编译器生成的默认构造函数工作 - C++
- 我似乎无法让我的最大长度递归函数工作
- 无法让 SHGetKnownFolderPath() 函数工作
- Qt 5.2无法使qWait函数工作
- 模板作为递归函数工作
- 构造函数工作不正常
- 如何让c风格的字符串函数工作
- 我如何让这个构造函数工作
- C函数工作,c++版本不
- 为什么我的衍生自CRTP函数工作
- 不明白为什么这个C++递归函数工作背后的逻辑
- 对不存在的对象调用成员函数工作正常,c++
- 如何使 cv::setMouseCallback 函数工作