2016-06-18 2 views
0

Это может быть довольно шумный вопрос, но я не смог разобраться в этом сам.Доступ к внешнему контексту в lambdas

Итак, я пытаюсь передать лямбда в следующей функции:

wiringPiISR(int pin, int mode, void (*function)()) 

... какие результаты в этом:

wiringPiISR(Pin::BELL, INT_EDGE_RISING, [] {}); 

... и, кажется, работает, так что я очевидно, может использовать лямбда вместо того, чтобы указывать на функцию.

Но то, что я на самом деле хочу сделать что-то подобное, с захватом this для доступа к функции onInterrupt(Pin pin) во внешнем контексте:

wiringPiISR(Pin::BELL_1, INT_EDGE_RISING, [this] { 
    onInterrupt(Pin::BELL_1); 
}); 

wiringPiISR(Pin::BELL_2, INT_EDGE_RISING, [this] { 
    onInterrupt(Pin::BELL_2); 
}); 

..., что приводит это сообщение об ошибке:

No matching function for call to wiringPiISR 

Я не очень разбираюсь в использовании C++ - lambdas, я знаю закрытие от многих других языков, но очевидно, что они работают по-разному в C++. Этот захват, похоже, модифицирует подпись закрытия, но я не знаю, как это исправить, или даже если есть возможное решение, не указывая на «фактическую» функцию.

Спасибо заранее

+0

Я предполагаю, что 'onInterrupt' является членом. Поэтому я предлагаю вам попробовать 'this-> onInterrupt (...)'. Я видел подобное поведение, когда компилятор не смог скомпилировать его без явного 'this->'. –

+0

Нет, это ничего не меняет, я уже пробовал это. Похоже, что 'wiringPiISR' не принимает это закрытие, если я правильно интерпретирую сообщение об ошибке. – andreaspfurtscheller

+0

Извините, не заметил указателя функции в первом чтении. Это немного меняет ситуацию (на самом деле даст ответ). –

ответ

2

C++ лямбда только конвертируемых функционировать указатели, если нет нет захвата (и захват this, как указано).

Также см draft C++11 standard раздел 5.1.2:

Тип закрытия для лямбда-выражения , без лямбды-захвата имеет общественную невиртуальную без явного Const функции преобразования в указатель для функции с теми же параметрами и типами возврата, что и замыкание Оператор вызова функции типа.

В качестве решения вы можете использовать std::function вместо указателя функции.

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