c++ - 在类中将函数作为参数传递
问题描述
我在将函数作为 C++ 中的参数传递时遇到问题。我在这里重新创建了一个最小的工作示例:
#include <iostream>
using namespace std;
void print(const double &func(double)) {
cout << func(1) << endl;
}
class Obj {
public:
double MyFunction(double x);
void PrintFunction();
};
void Obj::PrintFunction(){
print(MyFunction);
}
double Obj::MyFunction(double x) {
return x + 1;
}
int main() {
Obj object;
object.PrintFunction();
}
在这种情况下,整体结构看起来很奇怪,但在完整的代码中更有意义(具体来说,我理想地寻找一种不涉及重构函数所有权的解决方案)。这与错误一起编译error: invalid use of non-static member function double Obj::MyFunction(double)
,这表明我的调用方式有问题print(MyFunction)
。粗略的理解是不能自己MyFunction
调用的,但是再多的包含指针、引用等,都没有成功得到代码编译。我应该如何正确调用MyFunction
?
解决方案
您可以使用 std::bind 传递成员方法。
#include <iostream>
#include <memory>
#include <functional>
void print(std::function<double(double)> f) {
std::cout << f(1) << std::endl;
}
class Obj {
public:
double MyFunction(double x);
void PrintFunction();
};
void Obj::PrintFunction(){
auto t = std::bind(&Obj::MyFunction,this,std::placeholders::_1);
print(t);
}
double Obj::MyFunction(double x) {
return x + 1;
}
int main() {
Obj object;
object.PrintFunction();
}
推荐阅读
- python - Python在同一目录中导入一个包
- axon - Axon Framework 生成的代理阻止了 Spring AOP 代理的生成
- r - 如何在 Shiny 中给出文本预测句子的细分
- android - 是否可以在android中制作纯控制台应用程序
- hyperledger-fabric - 由于设置 orderer.tls.clientKey.file 不存在,频道创建失败
- python - 如果 xpath 以某种方式发生了变化,我该如何单击按钮
- python - 在我的视野开始轮询并在电报上发送消息后,CallbackContext 错误一直显示在 cmd 上
- angular - 反应形式总是有效的,即使不是。表单中的嵌套子级
- arrays - 在 React 渲染中使用数组内的数组
- c# - 使用 RowFilter 过滤 datagridview asp.net 的 textchange 事件