Лямбда-выражение как функтор-член в классе

Я был в восторге, когда лямбда-выражения (LE) стали частью gcc, начиная с 4.5.1, и надеялся, что они предоставят способ избавиться от этих неприятных указателей на функции в C++, которые, насколько я понимаю, в основном были скомпилированы как функции C. Все эти статические объявления и т.д...

Теперь я хотел использовать ЛЭ в классе, где можно выбрать метод вычисления функтором. Но из-за определения в предложении для 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 в новом стандарте не дает особых надежд.

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


person gilgamash    schedule 29.07.2011    source источник


Ответы (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); };
}
person Henrik    schedule 29.07.2011
comment
Привет. «theOp» должно быть «myOp», я только что исправил это. Проблема заключается в определении самих функторов. Я хочу, чтобы функтор, используемый в eval, был выбран как плюс или минус. Что-то вроде указателя на функцию. И я хочу сделать это, используя лямбда-выражения, так как я думал, что это одна из полезных настроек для них. Я попробую ваше предложение! Однако вместо этого было бы лучше использовать функторы с именами... - person gilgamash; 29.07.2011
comment
Работал отлично! Большое спасибо, я просто назову параметр, который будет работать. Еще раз спасибо, Энди. Извините, я пока не могу проголосовать... - person gilgamash; 29.07.2011