gpt4 book ai didi

C++ 在另一个函数中调用一个类函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:05 24 4
gpt4 key购买 nike

我试图通过将类成员函数作为参数来调用类内部的外部函数(将函数作为输入)。我的代码如下:

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 的错误。我想出一个解决这个问题的方法是修改外部函数,使其也接受一个类对象。有没有办法在不实例化新类对象的情况下做到这一点?提前致谢!

最佳答案

更通用的方法是放弃这些 1970 年代的函数指针并使用本世纪的技术:

#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;
}
};

这提供了一种简单易行的方法来基本上绑定(bind)到任何类型的函数,并“融入”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;
}
};

注意我已经替换了 std::function<double(double)>使用推导的模板参数 Callable ;你不必这样做,但通常不强制 lambda-to- std::function不需要时进行转换。 (个人我非常喜欢能够强制 f 接受一个 double 并返回一个 double,而不必依赖它的用法来检查它。)

关于C++ 在另一个函数中调用一个类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27600588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com