问题标签 [boost-signals2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
477 浏览

c++ - `boost::signals2` 中的信号签名是如何实现的?

我已经boost::signals2在我的项目中使用了一段时间。令我感到羞耻的是,我仍然不明白它们是如何在幕后实现的。我的问题已经从信号的定义开始了。如何定义如

处理?我可以从实现细节中看到,签名变成了一个恰当命名的模板参数Signature。但是,我不明白语法。C++ 标准是否允许这种语法?以这种形式提供的信号如何“存储”函数签名?

我已经尝试查看源代码,但无法找到此语法的解释。任何帮助,将不胜感激。

0 投票
1 回答
1194 浏览

c++ - 如何使用 Boost.Signals2 connect_extended?

我的C++ 项目中有一个可用的 Boost.Signals2signal和组合,并像这样设置;slot

我一直在尝试更进一步并使用该boost.signals2 connect_extended功能,因为我想将调用的详细信息传递signal给 the ,slot以便在以后的某个时间slot可以断开自身与 the的连接。signal对此的语法使我无法理解。请有人演示如何转换上述代码,以便connect_extended将连接信息传递给slot.

PS 我一直在查看 boost 网站上提供的这个示例,但对于如何根据我的参数使用的要求来定制它仍然不明智bind

Boost.Signals2 connect_extended 示例

谢谢

0 投票
1 回答
347 浏览

c++ - 在 Objective-C/C++ 中使用 Signals2 将 C++ 模型连接到控制器

我正在开发一个跨平台的 C++ 数据模型,其中包含近 1,000 种不同类型的数据项(但 < 100 种不同的数据结构/类)。为了处理模型到控制器的消息(即通知控制器某些数据项已更改),我正在考虑使用 boost:signals2。我认为这将有助于创建一个统一的观察者模式,该模式在不同的操作系统平台上保持不变。最初的实现是在 Mac OS / IOS 上,随后的 UI 是在 .net 和 unix 上开发的。

问题:

1)为了建立数据模型的观察,控制器应该连接什么类型的对象到信号2对象/插槽?对于观察到的每个数据项,控制器中是否应该有特定的功能/方法/选择器?这些函数应该是 C、C++ 还是 Objective-C/C++ 函数?

2) 信号应该具有什么级别的粒度?每个数据项都应该有自己的吗?或者模型对相关结构/记录的管理是否应该为每种类型的结构/记录维护一个信号?例如——应用程序偏好是否应该为所有偏好数据提供一个信号——传递关于哪些数据项被更改的信息?

3)发送信号(或接收信号的槽)的过程是否应该在单独的线程中执行?

4) 我知道 Cocoa 有自己的 Key-Value Observing 系统。但是这样的系统是否有利于与模型的基于信号 2 的观察者范式相结合 - 还是只是多余的?

更新:

关于实际 signal2 对象(不是观察者)的“粒度”,我认为每个文档有一个,应用程序首选项一个可能是一个不错的起点。我的文档数据已经有了一个“关键”概念,因此可以概括常见的 UI 案例,其中 UI 组件与特定的模型数据项相关联。

0 投票
2 回答
804 浏览

c++ - 多久从 boost::signals::trackable 派生一次?

使用 Boost.Signals 时,boost 允许您派生自boost::signals::trackable,以简化对象/连接生命周期管理(请参阅boost 文档)。

我处于我的项目的早期阶段,我正在考虑,是否boost::signals::trackable

  • 我写的每一个可能在未来使用 Boost.Signals 的新类
  • 或者只有在课堂上,我确信他们将需要基本trackablee 级的功能

第一种方法的主要原因是防止我忘记从boost::signals::trackable.

还有双重推导,例如

变得不必要。

另一方面,防止内存泄漏不应该是主要的设计方面。应该使用 valgrind 等测试和分析工具来检测内存泄漏。

哪种方法更适合成长中的项目?

0 投票
2 回答
593 浏览

c++ - C++ 信号2 槽回调是否可以包含 Objective-C/C++ 类/选择器(方法)信息?

这对你们中的一些人来说一定很明显,但我找不到这样的例子:

我需要一个 boost::signals2 信号来连接作为 C++ 类成员函数或函子的槽回调,因此我可以将模型回调制作成 Objective-C/C++ 控制器代码。

该回调需要存储可以在 C++ 回调函数中调用的 Objective-C/C++ 方法实例的类和选择器。(我假设没有办法实际提供 Objective-C/C++ 方法的直接回调函数地址)。我假设我需要创建一个 C++ 类/仿函数的实例来包含用于调用 Objective-C/C++ 方法的信息。

我也不确定我是否可以分离出 Class 和 SEL(选择器)并将它们存储在 C++ 类的实例中以进行回调而不将它们作为 void* 传递。一旦 signal() 调用了 C++ 回调,我希望我可以使用 class_getInstanceMethod 和 method_getImplementation 将它们转换为可用(可调用)的形式。

此外,我可能希望将至少一个带有任意结构(“EventInfo”)的参数从信号发送到槽,它可以提供有关信号性质的信息。

任何人都可以照亮黑暗吗?

0 投票
1 回答
747 浏览

c++ - boost::signals2 和异常处理

是否有某种方法可以覆盖在 boost::signals2 中调用插槽并执行某些操作(日志记录、调试、异常处理)的特定时刻?

我想在插槽调用时捕获异常,因为信号/插槽是我的代码中的执行路径在各种软件组件之间交叉的地方,每个组件都是可选的/如果行为不端可以在运行时禁用。因此,当插槽调用抛出(可能来自外部库,可能只是 std::bad_alloc)时,我希望收到有关它的通知——并知道哪个组件被发送到——所以我可以杀死那个组件。

我看不到如何在组合器中做到这一点,因为我无法访问那里的插槽或连接对象?所以我看不到获取任何信息的方法。(更改每个插槽的返回类型是不可行的。)

有没有一些我错过的超级简单的方法来做到这一点?

如果没有,我应该怎么做?

子类诸如 slot_call_iterator (将调用包装在 try/catch 中)和 connection_body_base (例如存储有关它所属的组件的信息)并提升使用这些?(如何?)

或者子类signals2::slot<...>,在构造函数中给它有关拥有组件的信息并以某种方式重载operator()(...)?(对此也不知道,使用所有模板魔法似乎要困难得多。)

0 投票
1 回答
998 浏览

c++ - 将库链接在一起时的 boost::signals2 未定义引用

我想将两个库链接到我的程序。第一个,定义一个发出信号的对象(属于ProducerObject类)。第二个库定义了两个类:一个包含多个ProducerObject实例的从属类和一个可以通过从属类订阅ProducerObject信号的主类。

第一个lib的代码是:
ProducerObject.hpp:

生产者对象.cpp:

在 Debug 目录中编译它,该目录与使用命令的代码处于同一级别:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -fPIC -MMD -MP -MF"ProducerObject.d" -MT"ProducerObject.d" -o "ProducerObject.o" "../ProducerObject.cpp"

g++ -shared -o "libProducerObject.so" ./ProducerObject.o

第二个库的代码是:
MasterAPI.hpp:

从API.hpp:

SlaveBase.hpp:

MasterAPI.cpp:

从API.cpp:

SlaveBase.cpp:

使用以下代码编译此代码:

g++ -I"/home/chris/workspace/ProducerObject" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -fPIC -MMD -MP -MF"MasterAPI.d" -MT"MasterAPI.d" -o "MasterAPI.o" "../MasterAPI.cpp"

g++ -I"/home/chris/workspace/ProducerObject" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -fPIC -MMD -MP -MF"SlaveAPI.d" -MT"SlaveAPI.d" -o "SlaveAPI.o" "../SlaveAPI.cpp"

g++ -I"/home/chris/workspace/ProducerObject" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -fPIC -MMD -MP -MF"SlaveBase.d" -MT"SlaveBase.d" -o "SlaveBase.o" "../SlaveBase.cpp"

g++ -L"/home/chris/workspace/ProducerObject/Debug" -shared -o "libObjectAPI.so" ./MasterAPI.o ./SlaveAPI.o ./SlaveBase.o -lProducerObject

最后,程序本身:
ObjectTest.cpp:

编译:

g++ -I"/home/chris/workspace/ProducerObject" -I"/home/chris/workspace/ObjectAPI" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -MMD -MP -MF"ObjectTest.d" -MT"ObjectTest.d" -o "ObjectTest.o" "../ObjectTest.cpp"

g++ -L"/home/chris/workspace/ProducerObject/Debug" -L"/home/chris/workspace/ObjectAPI/Debug" -o "ObjectTest" ./ObjectTest.o -lObjectAPI -lProducerObject

该程序产生以下输出,这正是我们想要的:

--> 向 master1 发送专用消息:
在 MasterAPI(1) 中收到的消息:值 = 11

--> 从 procuder1 发送广播消息:
MasterAPI(1) 中
收到的消息: value = 22 MasterAPI(2) 中收到的消息: value = 22

--> 从 procuder2 发送广播消息:
MasterAPI(1) 中收到的消息:值 = 33

为了产生这个输出,我不得不依赖辅助方法connect2,它以boost::function作为参数。我想避免这种情况,因为插槽的签名应该已经包含在 *broadcast_slot_t* 类型中。因此,我想要实现的代码版本将不包含connect2方法。但是,如果我在MasterAPI::subscribeToProducer方法的实现中从connect2切换到connect(只需将注释更改为测试),最后一个编译阶段(所有内容都链接在一起)会产生以下错误:

为什么以及如何避免它?

0 投票
1 回答
2184 浏览

c++ - 为 boost::signals2 绑定类成员函数

我使用 std::bind 创建了一个涉及类成员函数的 lambda,但 boost::signals2 不会接受它。

我有一门课Cut,我想在有新课时Event通过调用来通知void Cut::newEvent(Event& e)

我创建了一个到 Cut 实例的 lambda 绑定,当我将事件传递给它时,它按预期工作。(代码编译,输出为“Registered new event”。)

但是,当我尝试将此 lambda 连接到boost::signals2::signal<void(Event&)>它的实例时,会出现以下消息:

error: 'f' cannot be used as a function

这很奇怪,因为我可以将它用作 main() 中的函数。(如果我使用std::function<void(Event&)>而不是 auto,我会得到相同的结果。

有可能完成这项工作吗?为什么它目前不起作用?

这是相关代码:

0 投票
1 回答
362 浏览

boost - 如何将不可复制的对象用作带有 boost::signals2::signal 的插槽

我有一个不可复制对象的实例,我想将其与增强信号 2 一起使用。connect 方法期望我的仿函数是可复制的。有没有办法解决这个问题?如何删除下面代码中的注释?

有没有办法将对no_copy对象的引用传递给connect方法?

0 投票
1 回答
250 浏览

c++ - Signals2 connect() 与模板一起使用

我正在尝试为发送不同类型的数据所需的一些重复功能创建模板类。但是,我的问题(我认为)实际上与使用boost::signals2::signal::connect()的InterfacePublisher::addSubscription()函数有关。

似乎连接函数正在获取基类的位置,即使派生类覆盖了它们。我确信会有一个解决方案,但现在我坚持了很长时间。

我在下面粘贴我的代码。这个想法是将字符串从StringPublisher传递给StringSubscriber ,而无需通过模板对类名进行硬编码: