Я использую такой шаблон, С++ 11:
class FooViewController {
void build() {
auto label = ...
network->doWork([] (const Result& r) {
label->setText(r.text);
});
}
}
FooViewController может деконструироваться до завершения doWork
, вызывая сбои. Глядя на boost::signals2, я думаю об использовании boost::signals2::trackable
, который отлично работает для моих однопоточных целей, с тем преимуществом, что мне не нужно удерживать и управлять своими соединениями напрямую, однако я не уверен, как получить такой решение, работающее с лямбдами.
Вот рабочая лямбда-бесплатная версия:
class Foo : public boost::signals2::trackable {
public:
void bar() {
printf("Fire!");
}
};
Usage:
boost::signals2::signal<void()> signal;
{
Foo test;
signal.connect(boost::bind(&Foo::bar, &test));
signal();
}
signal();
Output:
Fired!
// Note a second 'Fired!' did not occur, which is correct behavior
Две цели:
1-- Я хотел бы сделать что-то вроде:
signal.connect(boost::bind([] {
printf("Fired!");
}, &test));
Который НЕ будет вызывать лямбду после того, как test
будет снесен.
2-- Я не хочу напрямую управлять объектами подключения, возвращаемыми .connect
.
bind()
вокруг нее. Можете ли вы просто использоватьtrackable
, так как это все еще связанный первый параметр? - person sehe   schedule 18.08.2015