当lambda表达式(LE)是gcc开始4.5.1的一部分时,我很激动,并希望他们能够在C ++中找到摆脱那些讨厌的函数指针的方法,基本上,根据我的理解,编译为C功能。所有这些静态声明等......
现在我想在类中使用LE,其中可以选择仿函数的计算方法。但由于C ++ 1x提案中的定义,这似乎根本不可能。这里是代码和问题。
#include<functional>
typedef std::function<double(double, double)> tMyOp;
class testLE
{
public:
testLE(){ m_oFactor = 2.5; }
void setOp(const int i)
{
if (i > 0) {myOp = plus;} else {myOp = minus;}
}
double eval(double x, double y) { return myOp(x, y); }
private:
double m_oFactor;
tMyOp plus;
tMyOp minus;
tMyOp myOp;
};
#include "testLE.h
tMyOp testLE::plus = [](double x, double y) -> double
{
return m_oFactor*(x + y);
};
tMyOp testLE::minus = [](double x, double y) -> double
{
return m_oFactor*(x - y);
};
所以问题是,除非我将仿函数_myOp,_minus和_plus声明为静态,否则这将无法编译,但是一旦我这样做,我就不再访问成员变量(在这种情况下是因子) 。在仿函数的定义中使用[this]而不是[]也不起作用。
老实说,imho这比功能指针替代方案更糟糕......所以我会很乐意提供帮助,但在新标准中阅读LEs的规格并没有太多希望。
谢谢,并祝福, 安迪
答案 0 :(得分:1)
我发现你不想完全清楚你想做什么。
定义setOp会有这样的帮助吗?
void testLE::setOp(int i)
{
if (i > 0)
myOp = [this](double x, double y) -> double { return m_oFactor*(x + y); };
else
myOp = [this](double x, double y) -> double { return m_oFactor*(x - y); };
}
或者您可以在构造函数中指定plus
和minus
:
testLE()::testLE()
{
m_oFactor = 2.5;
plus = [this](double x, double y) -> double { return m_oFactor*(x + y); };
minus = [this](double x, double y) -> double { return m_oFactor*(x - y); };
}