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

C++ calling a class function inside another function

本文关键字:类函数 函数 调用 另一个 C++      更新时间:2023-10-16

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

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

这提供了一种简单易行的方法来绑定到基本上任何类型的函数,并将成员函数的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到std::function的转换。(就我个人而言,我非常喜欢能够强制f将采取double并返回double,而不必依赖其用法来检查这一点。

此函数calculate_parameter必须是静态的。有关函数对象的更多信息,请访问功能对象