C外部函数,指向函数作为参数,在具有成员函数的类中使用
作者:互联网
相当新的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);
}
配方是假的.这不编译.我尝试了简单的intF,A :: * intF,& A :: intF,甚至是一些非正统的组合,但这只是猜测.问题是A类不是唯一一个利用全局外部函数的东西,它应该能够在运行时成为用户选择.搜索显示一些答案说,不可能指向这样的成员函数,因为它需要实例化(?),但我找不到解决方案.可以这样做吗?如果有,怎么样?
编辑:附加问题:如果成员函数是const double f(…)const,如何完成指向成员函数的指针?
解决方法:
一种变体就是使用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);
}
所有这些也适用于常量成员函数.
标签:std-function,c,function-pointers 来源: https://codeday.me/bug/20190828/1756600.html