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

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无法转换.我想出一种方法来解决这个问题,就是修改外部函数,使得它也需要一个类对象.有没有办法在不实例化新类对象的情况下执行此操作?提前致谢!

Lig*_*ica 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;
    }
};
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,而不必依赖于它的使用进行检查.)

  • 这种千年技术是一种lambda,而不是古老的绑定. (4认同)
  • @nurettin:"自我满足"?什么??尽量不要这么粗鲁,谢谢. (2认同)