我试图通过给出类成员函数作为参数来调用类中的外部函数(它将函数作为输入)。我的代码如下:
using namespace std;
// This is my external function
double integrate (double a, double b, int steps, double (*func)(double)){
// code for integration using function pointer
};
Class A
{
protected:
vector<double> to_data, from_data;
int data_size;
public:
A (); // constructor
double calculate_parameter(double t){
// some class member function that makes use of other class members
};
double get_result(double x){
double sum = 0;
for (int i=0;i<data_size;i++){
// this is basically what causes the error
sum = sum + integrate(to_data[i],from_data[i],1,calculate_parameter);
}
};
}
但是,它显示错误,函数calculate_parameter无法转换。我想出一种方法来解决这个问题,就是修改外部函数,使得它也需要一个类对象。有没有办法在不实例化新类对象的情况下执行此操作?提前谢谢!
答案 0 :(得分:9)
更通用的方法是放弃这些20世纪70年代的功能指针,并使用本千年的技术:
#include <functional>
double integrate (double a, double b, int steps, std::function<double(double)> f)
{
// ...
}
class A
{
double calculate_parameter(double t);
double get_result(double x)
{
using std::placeholders::_1;
double sum = 0;
for (int i = 0; i < data_size; i++) {
sum = sum + integrate(
to_data[i],
from_data[i],
1,
std::bind(&A::calculate_parameter, this, _1)
);
}
return sum;
}
};
这提供了一种简单易用的方法,可以绑定到基本上任何类型的函数,并且可以“烧掉”#34;成员函数的this
指针指向仿函数本身,而不需要在最终的调用点(即integrate
内)任何魔法,只需要调用f
!)。
更多&#34;现代&#34;这样做的方法是将调用包装在lambda中的calculate_parameter
:
template <typename Callable>
double integrate (double a, double b, int steps, Callable f)
{
// ...
}
class A
{
double calculate_parameter(double t);
double get_result(double x)
{
double sum = 0;
for (int i = 0; i < data_size; i++) {
sum = sum + integrate(
to_data[i],
from_data[i],
1,
[this](double x) { return this->calculate_parameter(x); }
);
}
return sum;
}
};
请注意,我已使用推导出的模板参数std::function<double(double)>
替换了Callable
;你没有 来做这件事,但是当你不必要时,不要强制进行lambda-to std::function
转换。 (个人我非常希望能够强制f
将double
并返回double
,而不必依赖其使用来检查这一点。 )
答案 1 :(得分:-1)
此函数calculate_parameter必须是静态的。 阅读有关函数对象的更多信息 Fuction Objects