C ++外部函数,带有指向函数的指针作为参数,在具有成员函数的类中使用

时间:2016-08-20 11:59:05

标签: c++ function-pointers std-function

C ++相当陌生。假设我有一个班级:

class A
{
private:
    double m_x, m_y;
public:
    A(double x, double y): m_x {x}
    {
        m_y = extF(m_x, y, *intF);
    }

    double intF(double x) { return 2*x; }
};

它利用了其他地方定义的外部全局函数:

double extF(double x, double y, std::function<double(double)> f)
{
    if (x*y < 0)
        return f(x);
    else
        return f(y);
}

公式是假的。这不编译。我尝试过简单的intFA::*intF&A::intF,甚至是一些非正统的组合,但这只是猜测。问题是类A不是唯一一个使用全局外部函数的类,它应该是运行时用户选择的东西。搜索显示一些答案说它不可能指向这样的成员函数,因为它需要实例化(?),但我找不到解决方案。可以这样做吗?如果是,怎么样?

编辑:附加问题:如果成员函数是const double f(...) const,如何完成指向成员函数的指针?

2 个答案:

答案 0 :(得分:3)

一种变体就是使用lambda:

class A
{
private:
    double m_x, m_y;
public:
    A(double x, double y): m_x {x}
    {
         m_y = extF(m_x, y, [&](double d){ return intF(d);});
    }

    double intF(double x) { return 2*x; }
};

另一种变体是使用lambda和std::mem_fn(省略你班级的其余代码):

A(double x, double y): m_x {x}
{
    auto fn = std::mem_fn(&A::intF);
    m_y = extF(m_x, y, [&](double d) {return fn(this, d);});
}

最后,如果你bind成员函数指针的对象参数,你可以摆脱lambdas:

A(double x, double y): m_x {x}
{
    auto fn1 = std::bind(std::mem_fn(&A::intF), this, std::placeholders::_1);
    m_y = extF(m_x, y, fn1);
}

所有这些也适用于常数成员函数。

答案 1 :(得分:2)

您可以使用std::bind绑定成员函数。

A(double x, double y): m_x {x}
{
    using namespace std::placeholders;
    m_y = extF(m_x, y, std::bind(&A::intF, this, _1));
}

或使用lambda

A(double x, double y): m_x {x}
{
    m_y = extF(m_x, y, [this](double d) { return intF(d); });
}

BTW:它也适用于const成员函数,这在这里无所谓。

LIVE