2015-02-18 3 views
5

Мое название - мой главный вопрос. В приведенном ниже коде показано, что я хочу сделать, но это вызывает ошибку.Как передать лямбду в функцию с захватом?

class B 
{ 
public: 
    void DoSomething(void (*func)()) 
    { 
     func(); 
    } 
}; 

class A 
{ 
public: 
    int x; 
    void Start(B* b) 
    { 
     auto func = [this]()->void 
     { 
      this->x++; 
     }; 
     b->DoSomething(func); 
    } 
}; 

Если удалить «это» ключевое слово, то программа работает, но я не могу ссылаться на переменную х.

Итак, как я могу это достичь?

+3

Пожалуйста, пост кода и ошибки. Скриншоты не доступны для поиска. – Pradhan

ответ

6

Изменение DoSomething в

void DoSomething(std::function<void()> func) 

Текущий параметр void (*func)() является указателем на функцию C-стиль, который не принимает никаких параметров, поэтому переменная this не может быть передан в функцию.

std::function<void()> однако может представлять что-либо вызываемый, который не принимает параметров и ничего не возвращает. Это может быть сырая функция, или это может быть ваша лямбда.

1

Альтернативой является простое использование шаблонов, чтобы избежать потенциальных накладных расходов, связанных с большими лямбдами, которые должны быть упакованы с помощью std :: function.

#include <functional> 

using namespace std; 

template<typename Callable> 
void DoSomething(Callable c) { c(); } // calls the lambda with no args 

int main() 
{ 
    DoSomething([]{ printf("Hello\n"); }); 
    DoSomething([msg = "World"] { printf("%s\n", msg); }); 
} 

Живой Код: http://goo.gl/LMvm3a

Смежные вопросы