c ++使用std :: function指向成员函数的指针

时间:2017-04-02 01:43:41

标签: c++ function c++11 pointers

我知道这已被多次询问,大部分答案都让我难以理解。 你能不能帮我弄清楚我做错了什么?

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <functional>

class A{
    public:
        A(double i){
            _b = i;
        }
        double square(double i){

            return i*i*_b;
        }


    private:
    double _i;
    double _b;
};

double cube(double (*objfunc)(double), double x){
    return objfunc(x)*x;   
}

int main()
{
    double v = 2.0;
    A a(v);

    using std::placeholders::_1;
    std::function<double(double)> f_square = std::bind( &A::square, &a, _1 );
    double x = cube(f_square,3.0);
    std::cout << " x = " << x << std::endl;


}

永远感谢您的建议。

给定A类和立方体函数,因为它们如何在main函数中使用cube函数?

更新:只有这样才能修改:

double cube(std::function<double(double)> objfunc, double x){
    return objfunc(x)*x;   
}

1 个答案:

答案 0 :(得分:2)

使cube取一个std::function对象而不是函数指针。同时摆脱std::bind并使用lambda和auto的魔力。

#include <iostream>
#include <functional>

class A
{
public:
  A(double i) : _b(i) {}
  double square(double i) { return i*i*_b; }
private:
  double _b;
};

double cube(std::function<double(double)> objfunc, double x)
{
  return objfunc(x)*x;   
}

int main()
{
  double v = 2.0;
  A a(v);

  auto f_square = [&a] ( double x ) { return a.square(x); };
  double x = cube(f_square,3.0);
  std::cout << " x = " << x << std::endl;
}