问题标签 [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 投票
1 回答
386 浏览

c++ - boost::signal2 bind to pure or member function using enable_if

I am currently trying to implement a member function of a class which allows for setting a callback that is either itself a member function (of a potentially different class) or a pure function not being part of a class.

Given such a class,

works fine for non-member methods. However I am sort of failing implementing something that lets the user connect to either a member of not. This is what I tried:

called by some other classes' member function like this:

and finally

Any help here is welcome!

P.S.: I am using VS 2015, which quits with an error

0 投票
1 回答
159 浏览

c++ - Boost Signals2:如何注册鼠标点击和按键等事件?

我目前正在开发一款游戏,我计划使用 signals2 库在 C++ 中进行事件处理。

但是,我不明白这一切是如何组合在一起的,因为我想要诸如“按下按键”和“鼠标点击”之类的事件,以及诸如套接字上的传入连接之类的事件。如何注册这些活动?似乎这个库用于这种类型的事情,但网上似乎没有任何关于如何进行这些类型的事件处理的提示。

0 投票
1 回答
533 浏览

boost - 'boost::detail::variant::visitation_impl': 2 个重载都不能转换所有参数类型

我无法使用 Boost 库 1.61.0 和 Visual Studio 2015 Update 3 构建我的两个项目。

这些项目多年来一直使用 Visual Studio 和 Boost 版本的各种组合构建良好,除了更新 Visual Studio 和 Boost 库外,我没有更改代码中的任何内容。

我在这两个项目中得到的错误是:

在这两个项目中,我都没有直接从我的代码中使用 boost::variant。在一种情况下,它看起来像是从 boost::signals2 使用 boost::variant (我也没有直接从我的代码中使用它),而在另一种情况下,它看起来像是从 Cpp-Netlib 使用 boost::variant 0.11.2。

以下是这两个项目的输出日志的相关部分:




这是 boost 库中的错误吗?

0 投票
1 回答
366 浏览

c++ - 插槽在哪个线程中执行?

假设我有四个线程,具有以下对象:

线程1:管理一个boost::signals2对象。调用它s

线程 2:管理一个X对象和对s. 调用X对象o2。成员函数X::do()连接到s,要在 上执行o2

线程 3:管理一个Y对象和对s. 调用Y对象o3。成员函数Y::do()连接到s,要在 上执行o3

线程 4:管理对s, 和emits 信号的引用。

插槽在哪里执行?所有这些都在线程 4 中,emit调用发生在哪里?在线程 1 上,因为那是信号内存地址的线程?还是每个插槽都在其对应的线程(2 和 3)上执行?

最明显的事情是插槽被执行thread 4,因为有信号被发出(并且调用是同步的),但对我来说,执行函数的线程似乎很奇怪,或者一般来说,操作一个对象,其内存地址属于另一个线程(例如,在线程的堆上创建的对象,但在不同的线程中使用)。

访问“外来”线程是否至少比操作“我自己的”对象慢,或者根本没有区别?

0 投票
0 回答
194 浏览

c++ - 信号而不是异常

假设我们正在开发一个商店,并且根据会话状态,允许用户做不同的事情。例如,假设某个小部件必须在某个特定时刻被阻止一段时间,因为某些特定的用户操作,并且用户再次尝试。

当然,最明显的实现是在相应的函数(特定的事件处理程序)中启动一个异常,表示该操作当前被阻止。这类似于我的一个具体问题。在那种情况下,对我来说更方便的是,不是抛出异常,而是使函数成为“无操作”,但发出boost::signal2's 信号。GUI 做他想做的任何事情,通知用户或其他任何事情。但也许 GUI 只想通知用户一次,所以它只是在第一次调用后断开信号。

我喜欢它。它非常漂亮和优雅:使其成为无操作并发出信号。没有堆栈展开,函数可以标记为 noexcept,因此可以启用更多优化,并且仅在需要时处理异常情况,根据需要连接和断开信号。

现在问题来了,如果我想概括用每个异常替换信号的方法怎么办?即使对于非 GUI 应用程序?

在那种情况下,是否boost::signals2比异常更无效?因为普遍认为 try/catch 块、no-noexcept 函数和堆栈展开会导致开销并避免编译器进行许多可能的优化。另一方面,boost::signals2它是线程安全的,这会导致额外的开销。

难道我的想法是个坏主意吗?

我希望我的问题不会因为“过于宽泛”或“基于意见”而接近,因为它毕竟是一个设计(和优化)的问题;虽然不是太具体,但我不得不承认。

笔记:GUI 是一个网站。问题是,我正在使用 Wt,这是一个用 C++ 制作网站的库,它将小部件和信号的层次结构转换为 HTML/Javascript/Ajax,我的长期项目是创建一个套件,用于在两者中创建 GUI,来自具有独特 C++ 后端的通用基础架构的桌面/移动 (Qt) 和 Web (Javascript)。Wt 允许同一事件的 C++/Javascript 插槽之间的映射;例如,单击:如果 Javascript 或 Ajax 不可用,则将事件发送到服务器并调用 C++ 插槽。如果可用,则使用 Javascript 版本在客户端上执行该事件。如果同一个 (GUI) 事件有多个槽,则槽的执行顺序是未指定的,如果两个槽都是 C++ 调用,如果线程池中有足够的可用线程,它们甚至可以在服务器上并行执行.

0 投票
0 回答
341 浏览

c++ - Boost::signals2 阻塞多个插槽

假设我想实现一个基于有序槽的信号系统,我还可以阻止连接到一个函数。为了更清楚:

案例全连接: mysignal("string","string") 这连接到两个函数。

案例选择:mysignal("string","string") 仅发送到 func1_receiver

案例无:mysignal("string","string") 被阻止

所以我的代码是这样的:

现在,如果我想阻止一个插槽,我应该写:

这一切都很好。

如果我还想阻止第二个插槽,我应该投一个:

在这里我得到一个错误:“'boost::signals2::shared_connection_block block'的重新声明”

我想我可以随意阻止/取消阻止连接,但我误解了一些东西。

有人可以帮助我吗?

0 投票
1 回答
1120 浏览

c++ - C++ shared_ptr std::bind 和 std::function

我有以下内容:

B监听一个boost::signal2C,当触发时将执行类给定的回调A并执行类中的方法A

A,BC,D都是std::shared_ptr.

问题是当 classD释放指向 class 的指针时BB由于信号处理程序没有被删除。即使我打电话给断开连接,boost::connection我也有同样的问题。

知道如何解决吗?

0 投票
0 回答
314 浏览

c++ - 增强信号 2,自定义组合器,为什么它会触发副本

我有一个使用boost::signals2. 我需要返回一个不可复制的值。为了实现这一点,我尝试更改组合器模板参数。奇怪的是,在组合器内部我得到了一个错误。

这有效:

但是目前我尝试取消引用内部的迭代器Combiner::operator(),事情变得一团糟。

std::is_const<Iter>返回假。 std::is_reference<decltype(*b)>正在返回 true。

我不知道为什么我有错误,但我看到这里选择了错误的重载:

右值引用被激活,我在一个示例程序中检查了它,我在 gcc 中使用了 c++14 标志。任何想法?

编辑:完整的例子。

0 投票
2 回答
210 浏览

c++ - Boost 信号尖括号内的括号是什么意思?

在我的基本 c++ 书中,没有像下面这样的类声明。对我来说奇怪的代码是......

圆括号 ( const std:::string...) 中的内容不是类型名,而是实例。怎么可能?上面的代码编译得很好。

ps模板类(signal)代码是

0 投票
0 回答
49 浏览

c++ - 如何在 C++ 中将类更改为函数?

这是一个如上所述的类。但是,eclipse大纲视图显示这是一个功能。

在此处输入图像描述

遵循eclipse图标文档,这绝对是一个功能。

https://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Freference%2Fcdt_u_icons.htm

这个类如何变成一个函数?