J'utilise un modèle comme celui-ci, 11 C++:Utiliser boost :: signals2 :: traçable avec lambdas
class FooViewController {
void build() {
auto label = ...
network->doWork([] (const Result& r) {
label->setText(r.text);
});
}
}
FooViewController peut déconstruire avant doWork
finalise, ce qui provoque des accidents. En regardant boost :: signals2, je pense à utiliser boost::signals2::trackable
, ce qui fonctionne très bien pour mes objectifs à un seul thread, avec l'avantage que je ne dois pas gérer et gérer mes connexions directement, mais je ne suis pas sûr de savoir comment obtenir un tel une solution de travail avec lambdas.
est ici une version gratuite lambda de travail:
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
Deux objectifs:
1-- Je voudrais faire quelque chose comme:
signal.connect(boost::bind([] {
printf("Fired!");
}, &test));
qui ne serait pas appeler le lambda après test
est démoli.
2-- Je ne souhaite pas gérer directement les objets de connexion renvoyés par .connect
.
Honnêtement, je ne sais pas ce que le lambda-vous d'acheter quand vous avez la 'bind()' autour de toute façon. Ne pouvez-vous pas simplement utiliser le 'trackable', puisque c'est toujours le premier paramètre lié? – sehe
Je creuse les lambdas pour les captures. La liaison est apparue comme nécessaire lors de l'utilisation de traçabilité. Idéalement, smart_ptrs et track seraient naturels à signals2 (trackable est obsolète), mais il existe un mécanisme de compte de ref/autorelease pool existant dans l'application. Enquêter sur les prochaines étapes. – fionbio