gpt4 book ai didi

c++ - 将 boost::signals2::trackable 与 lambda 一起使用

转载 作者:行者123 更新时间:2023-11-30 05:39:52 25 4
gpt4 key购买 nike

我正在使用这样的模式,C++11:

class FooViewController {
void build() {
auto label = ...

network->doWork([] (const Result& r) {
label->setText(r.text);
});
}
}

FooViewController 可能会在 doWork 完成之前解构,从而导致崩溃。查看 boost::signals2,我正在考虑使用 boost::signals2::trackable,它非常适合我的单线程用途,好处是我不必持有和管理我的直接连接,但是我不确定如何使用 lambda 获得这样的解决方案。

这是一个可用的 lambda 免费版本:

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 被拆除后不会调用 lambda。

2-- 我不想直接管理 .connect 返回的连接对象。

最佳答案

可以看出here : “不建议对新代码使用可跟踪类”

也许选择使用 scoped_connectiontrack

例子:

#include <iostream>
#include <memory>

#include <boost/signals2.hpp>


struct short_lived : public boost::signals2::scoped_connection {
public:
short_lived(const boost::signals2::connection &conn) : boost::signals2::scoped_connection{conn}
{ }
~short_lived() {
std::cout << "I'm dying...1!" << std::endl;
}

};

int main() {
typedef boost::signals2::signal<void()> sig_type;
sig_type s1;

{
/* boost::signals2::scoped_connection */ short_lived conn{s1.connect([]() {
std::cout << "Fire1!" << std::endl;
})};
s1();
}
s1();
std::cout << std::endl;

{
auto lam = []() {
std::cout << "Fire2!" << std::endl;
};

/* shared_ptr with custom deleter that does not delete (since we didn't use new),
but prints a message */
std::shared_ptr<decltype(lam)> sptr{&lam, [](decltype(lam) *) { std::cout << "I'm dying...2!" << std::endl; }};
s1.connect(sig_type::slot_type(lam).track_foreign(sptr));
s1();
}
s1();

return 0;
}

http://melpon.org/wandbox/permlink/c8LHGIp8ArkKsnWA

关于c++ - 将 boost::signals2::trackable 与 lambda 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com