gpt4 book ai didi

boost - 如何只连接一次 boost 信号?

转载 作者:行者123 更新时间:2023-12-04 18:06:30 24 4
gpt4 key购买 nike

如何在 Boost 中实现 Qt::UniqueConnection 机制?

基本上,我只想连接一次信号。

最佳答案

据我所知,没有这样的东西,但您可以使用自定义组合器轻松模仿它。

1。使用自定义组合器

您可以忽略任何多余的插槽。例如,这个组合器只忽略第一个插槽以外的任何内容(即第一个添加了 at_front 且没有组,或者组中具有最高优先级的第一个,请参见 Ordering Slot Call Groups ):

template<typename Result>
struct call_first {
typedef boost::optional<Result> result_type;

template<typename It>
result_type operator()(It first, It last) const {
if (first != last)
return *first;
return boost::none;
}
};

现在这是一个测试用例: Live On Coliru

#include <iostream>
#include <boost/optional/optional_io.hpp>

int foo(int i) { std::cout << "(foo)"; return i*2; }
int bar(int i) { std::cout << "(bar)"; return i+2; }

int main()
{
using namespace boost::signals2;
signal<int(int), call_first<int> > sig;
std::cout << sig(42) << "\n"; // should be none ("--")

sig.connect(foo);
std::cout << sig(42) << "\n"; // should return 42*2

sig.connect(bar);

std::cout << sig(42) << "\n"; // should still return 42*2
}

打印

--
(foo) 84
(foo) 84

2。修复您的连接管理

通过使用非常简单的帮助程序(假设此示例使用 c++11),您可以轻松避免双重连接信号:

template <typename Sig, typename F> void try_connect(Sig& sig, F&& f) {
if (!sig.num_slots()) sig.connect(std::forward<F>(f));
}

template <typename Sig, typename F> void re_connect(Sig& sig, F&& f) {
sig.disconnect_all_slots();
sig.connect(std::forward<F>(f));
}

对应的测试用例 Live On Coliru :

int main()
{
using namespace boost::signals2;
signal<int(int)> sig;
std::cout << sig(42) << "\n"; // should be none ("--")

try_connect(sig, foo);
std::cout << sig(42) << "\n"; // should return 42*2

try_connect(sig, bar);
std::cout << sig(42) << "\n"; // should still return 42*2

re_connect(sig, bar);
std::cout << sig(42) << "\n"; // should return 42+2
}

输出:

--
(foo) 84
(foo) 84
(bar) 44

关于boost - 如何只连接一次 boost 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144152/

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