Ano*_*ast 4 c++ function-pointers class function
我试图通过给出类成员函数作为参数来调用类中的外部函数(它将函数作为输入).我的代码如下:
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);
}
};
}
Run Code Online (Sandbox Code Playgroud)
但是,它显示错误,函数calculate_parameter无法转换.我想出一种方法来解决这个问题,就是修改外部函数,使得它也需要一个类对象.有没有办法在不实例化新类对象的情况下执行此操作?提前致谢!
更通用的方法是放弃这些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;
}
};
Run Code Online (Sandbox Code Playgroud)
这提供了一种简单易用的方法,可以绑定到基本上任何类型的函数,并将this成员函数的指针"烘焙" 到函子本身,而不需要在最终的调用点(即内部integrate,只需要调用它)内的任何魔法f!).
一个更"现代"的方法是将调用包装calculate_parameter在lambda中:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,我已经std::function<double(double)>用推断的模板参数替换了Callable; 你不具备这样做,但它传统的不给力的λ-TO- std::function转换时,你不必.(个人我很喜欢能够强制要求f将采取double并返回double,而不必依赖于它的使用进行检查.)