gpt4 book ai didi

c++ - 使用 boost::signals2 处理许多信号/槽的连接/断开

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:28 25 4
gpt4 key购买 nike

我已经开始使用 boost::signals2 而不是我的旧信号代码。不过,我在管理多个连接时遇到问题。这是我的问题:

我有很多 Person 类的实例:

class Person {
public:
void SetName (string new_name)
{
name = new_name;
NameChange (name);
}

string name;
boost::signals2::signal<Person*> NameChange;
};

我还有一个人员浏览器,它必须监视所有可用人员的子集以了解变化。由于人们可以从该子集中进出,我必须有一种方法来处理连接对象,并且我创建了一个类 (ConnectionList) 来处理它:

class ConnectionList
{
public:
virtual ~ConnectionList () // drops all connections in "list"
void add (boost::signals2::connection& conn); // adds "conn" to "list"
private:
std::vector<boost::signals2::connection> list;
};

class PeopleBrowser
{
public:
void AddPerson (Person& p)
{
name_change_connections.add (p.NameChange.connect (...));
}
private:
ConnectionList name_change_connections;
};

这一切都很好,当删除 PeopleBrowser 时,连接将被删除,并且有一种添加新连接的好方法。

但是,我们需要添加另一个方法 RemovePerson,并且该方法必须删除与该 Person 实例的 NameChange 信号的连接。

这就是我卡住的地方。我想我可以使 ConnectionList 成为一个模板,并使用一个列表,该列表包含一个包含对信号和连接的引用的结构,然后添加一个方法来删除与该信号的所有连接。

但这似乎是一个很常见的情况(至少在我的世界里,我在这个单一的应用程序中有大约 20 个类需要这个功能),所以我认为必须有更好的方法来处理这个问题?

至少,有没有办法从连接对象中获取对连接信号的引用?

也许 libsigc++ 可以更好/不同地处理这个问题?

最佳答案

关于:

class PeopleBrowser
{
public:
void AddPerson (Person& p)
{
name_change_connections[&p] = p.NameChange.connect(...);
}
void RemovePerson(Person& p)
{
name_change_connections.erase(&p);
}

private:
std::map<Person*, boost::signals2::scoped_connection> name_change_connections;
};

您可能还想看看 automatic connection management .

关于c++ - 使用 boost::signals2 处理许多信号/槽的连接/断开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265797/

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