将增压信号2更换为C++;11个信号 我是一个为无人驾驶汽车开发自主系统的研究程序员,我正在修改一些来自另一个项目的开源代码,以制造一个用于车辆控制的驱动程序。我们的想法是有一个模块,该模块通常处理作为库加载特定于车辆的驾驶员的控制,现有的实现使用boost::signals2将模块函数调用绑定到驾驶员。因为这是目前唯一使用Boost的方法,所以我想删除Boost依赖项并使用C++信号,但是我很难弄清楚如何做。 我一直在尝试阅读Booo::StulsAls2和C++信号,看看我能不能教给自己原则和语法: - - - 我想我已经了解了这些概念,但是实现过程把我的tar弄糊涂了。我发布的第一个和第二个资源使它看起来像C++信号,它内置到C++ 11,但是第三个链接中的教程似乎定义了它自己的信号类,并且似乎根本没有使用语法。

将增压信号2更换为C++;11个信号 我是一个为无人驾驶汽车开发自主系统的研究程序员,我正在修改一些来自另一个项目的开源代码,以制造一个用于车辆控制的驱动程序。我们的想法是有一个模块,该模块通常处理作为库加载特定于车辆的驾驶员的控制,现有的实现使用boost::signals2将模块函数调用绑定到驾驶员。因为这是目前唯一使用Boost的方法,所以我想删除Boost依赖项并使用C++信号,但是我很难弄清楚如何做。 我一直在尝试阅读Booo::StulsAls2和C++信号,看看我能不能教给自己原则和语法: - - - 我想我已经了解了这些概念,但是实现过程把我的tar弄糊涂了。我发布的第一个和第二个资源使它看起来像C++信号,它内置到C++ 11,但是第三个链接中的教程似乎定义了它自己的信号类,并且似乎根本没有使用语法。,c++,boost,signals,boost-signals2,C++,Boost,Signals,Boost Signals2,看起来其他项目以前也做过类似的工作(),但我还没有找到任何具体的例子来说明之前和之后的比较——看到一个实现对我来说通常是正确的 从驱动程序库头文件: 类接口数据库 { 接口数据库(const-Config&cfg); 虚拟~InterfaceBase(){} 升压::信号2::信号状态变化; } 从驱动程序cpp文件: void InterfaceBase::check_change_state() { 如果(状态) { 信号状态变化(状态); } } 从模块cpp: 模板 无效连接(信号*

看起来其他项目以前也做过类似的工作(),但我还没有找到任何具体的例子来说明之前和之后的比较——看到一个实现对我来说通常是正确的

从驱动程序库头文件:

类接口数据库
{
接口数据库(const-Config&cfg);
虚拟~InterfaceBase(){}
升压::信号2::信号状态变化;
}
从驱动程序cpp文件:

void InterfaceBase::check_change_state()
{
如果(状态)
{
信号状态变化(状态);
}
}
从模块cpp:

模板
无效连接(信号*信号,插槽)
{信号->连接(插槽);}
模板
无效连接(信号*信号,对象*对象,无效(对象::*mem_func)(A1))
{connect(信号,boost::bind(mem_func,obj,_1));}
接口::接口()
{
if(cfg_u.has_driver_lib_path())
{
driver\u library\u handle=dlopen(cfg\u.driver\u lib\u path().c\u str(),RTLD\u LAZY);
如果(!驱动程序\库\句柄)
{
退出(退出失败);
}
}
其他的
{
退出(退出失败);
}
驱动程序=加载驱动程序(&cfg);
连接(&driver->signal\u state\u change,this,&Interface::ProcessStateChange);
}

驱动程序声明了一个信号,它可以使用该信号向加载它的模块发送数据,然后该模块将该信号绑定到一个函数,这样当调用该信号并向其提供数据时,数据就会发送到该函数。我只是想弄清楚如何在不使用Boost的情况下完成同样的事情,我想这意味着要弄清楚如何替换Boost::bind。任何指向正确方向的行为都是值得赞赏的;我将继续研究它,如果我能找到任何其他的方法,我将发表文章,以防它对将来走同一条路的人有所帮助。

这里的问题是,有两种相关但不同的技术,它们都被命名为信号

中的信号结构和相应的
与错误处理相关,例如当操作系统终止程序或发生灾难性内部错误时

例如Boost.signals2、Qt的信号/插槽等是观察器模式的更通用的实现,它允许一段代码提供松散耦合的方式,以便另一段代码在某个事件发生时获得通知或回调

前者实际上是后者的一个子集,因为POSIX信号主要与错误和终止事件有关,而信号和插槽通常也适用于不太可怕的事件,如“网络数据包已到达!”或“用户单击了按钮!”

我不建议尝试将通用信号槽解决方案硬塞进陈旧(和C风格)的POSIX信号API中

虽然没有标准的C++信号/时隙库,但是有很多第三方库,如你的一些链接所显示的。我不建议你自己动手,除非你有令人信服的理由重新发明轮子。(如果你必须自己动手,这是一个明显的起点。)Boost是一个高质量的实现,既然你已经在使用它,我会坚持使用它。(我们公司的经验法则是,在所有条件大致相同的情况下,“std>Boost>Qt>其他”,但YMMV除外。)


如果您只是想减少Boost文件夹的占用空间,Boost就可以做到这一点。

谢谢您-我开始认为我在考虑“信号”一词的两个不同概念,但这个解释澄清了很多。我肯定是在做信号和插槽的事情。这是否意味着在C++11中没有一种本机方法可以实现这一点,我需要以某种方式编写自己的实现?我添加了一段关于选择库与滚动自己的库的内容。感谢您的帮助!虽然Boost通常是一个高质量的库,但它的一些模块有一些奇怪的错误,比如使用
6.28318530718
来实现持续多年的
2π近似,例如@Ruslan Boost实际上不是一个库,而是一个库集合,它们具有不同的实用性和质量级别(但它们都是精心策划的,所以没有一个是完全糟糕的)。指向Boost.Units中的一个特定bug(Boost.Units是Boost中一个相对模糊的部分)并没有提到Boost.Signals2。