Lambda表达式作为类中的成员函子

时间:2011-07-29 09:34:30

标签: class lambda expression member functor

当lambda表达式(LE)是gcc开始4.5.1的一部分时,我很激动,并希望他们能够在C ++中找到摆脱那些讨厌的函数指针的方法,基本上,根据我的理解,编译为C功能。所有这些静态声明等......

现在我想在类中使用LE,其中可以选择仿函数的计算方法。但由于C ++ 1x提案中的定义,这似乎根本不可能。这里是代码和问题。

testLE.h

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

testLE.cpp

#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的规格并没有太多希望。

谢谢,并祝福, 安迪

1 个答案:

答案 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); };
}

或者您可以在构造函数中指定plusminus

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