【问题标题】:c++ pointer to member function using std::functionc++ 使用 std::function 指向成员函数的指针
【发布时间】:2017-08-27 02:08:26
【问题描述】:

我知道这个问题已经被问过很多次了,大部分答案我都很难理解。 你能帮我弄清楚我做错了什么吗?

#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 类和立方体函数,我如何在主函数中使用立方体函数?

更新:这样做的唯一方法是修改:

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

【问题讨论】:

  • 您正在尝试传递 std::function 实例,其中需要一个普通的函数指针。前者不可转换为后者。
  • 能否请您帮我修改主要功能以使其正常工作。使用 square 函数的正确方法是什么?
  • 我认为它不能做到,因为成员函数指针不是简单的指针。但我的理解非常有限。所以让我们等待专家进来。
  • 您不能只修改main 并使其工作:无论您如何用力推,方钉都无法装入圆孔。您可以修改cube 以采用std::function&lt;double(double)&gt; 参数。
  • 我同意。谢谢

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多