Лямбда-выражение как функторы-члены в классе - PullRequest
2 голосов
/ 29 июля 2011

Я был в восторге, когда лямбда-выражения (LE) были частью gcc, начиная с 4.5.1, и надеялся, что они дадут способ избавиться от этих неприятных указателей на функции в 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, это хуже, чем альтернатива указателя функции .... Так что я был бы очень рад помочь, ночтение спецификаций для LE в новом стандарте не дает особых надежд.

Спасибо и наилучшие пожелания, Энди

1 Ответ

1 голос
/ 29 июля 2011

Мне не совсем понятно, что вы хотите сделать.

Будет ли определение 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); };
}
...