Я знаю, что это старый вопрос, однако я думал, что поделился своим опытом использования Lambda capture
#include <iostream>
#include <memory>
using std::unique_ptr;
using std::make_unique;
using std::cout;
using std::endl;
class foo {
public:
foo(int no) : no_(no) {
}
template <typename Lambda>
void lambda_func(Lambda&& l) {
cout << "No is " << no_ << endl;
l();
}
private:
int no_;
};
int main() {
auto f = std::make_unique<foo>(10);
f->lambda_func([f = std::move(f)] () mutable {
cout << "lambda ==> " << endl;
cout << "lambda <== " << endl;
});
return 0;
}
. Этот сегмент кода неисправен
$ g++ -std=c++14 uniqueptr.cpp
$ ./a.out
Segmentation fault (core dumped)
Если I удалите инструкцию std::cout
из lambda_func
. Код запускается до завершения.
Кажется, что этот оператор f->lambda_func([f = std::move(f)] () mutable {
обрабатывает лямбда-захваты перед вызовом функции-члена.
Я бы передал ссылку на функцию на параметр обратного вызова. То, что вы делаете сейчас, вызывает функцию.
// Definition of the callback function
this.getListOfPossibleDrives = function (chosenBook) {
// Your code when a book is selected
}
// Configuration for the comboBox
var config = {
fieldLabel : i18n._('Department code'),
xtype : 'combo',
...
store : ...,
listeners : {
scope : this,
'select': self.getListOfPossibleDrives
}
}
Когда в параметре или объекте вы выполняете somefunction () (со скобками / скобками), вы фактически вызываете функцию, так что вам нужно в своей конфигурации или определять функцию как вы уже делали в начале, или передавая ссылку на другую функцию.
Это не волшебство, это только то, что вы можете передавать функции в качестве параметров. Например, вы можете получить следующее:
this.myFunctionOne = function (myStringParam) {
// Do things
}
this.anotherFunction = function (callback) {
// Do things... and call a callback function received as param
callback('hello');
}
this.anotherFunction(this.myFunctionOne);
// Or you can do directly
this.anotherFunction(function(param) {
console.log(param);
});
// With ES6 syntax
this.anotherFunction((param) => {
console.log(param);
});
Когда вы передаете функцию, вам не нужно указывать параметры, которые она должна получить.
anotherFunction будет вызывать обратный вызов (полученная функция) со строкой hello , поэтому в зависимости от функции она будет выполнять то или иное действие:
[112 ]Последний напечатает: Я печатаю другое сообщение: привет