【发布时间】:2025-11-27 06:40:01
【问题描述】:
我是一名研究程序员,正在为无人驾驶车辆开发自主系统,我正在修改另一个项目的一些开源代码,以制作用于车辆控制的驱动程序。这个想法是拥有一个模块,该模块通常处理将特定于车辆的驱动程序加载为库的控制,并且现有实现使用 boost::signals2 将模块函数调用绑定到驱动程序。由于这是它目前唯一使用 boost 的东西,我想删除 boost 依赖并使用 C++ 信号,但我很难弄清楚如何做到这一点。
我一直在尝试阅读 boost::signals2 和 C++ 信号的一般知识,看看我是否可以自学原理和语法: - https://en.cppreference.com/w/cpp/utility/program/signal - https://testbit.eu/2013/cpp11-signal-system-performance - https://simmesimme.github.io/tutorials/2015/09/20/signal-slot 我认为我正在了解这些概念,但实施却让我感到困惑。我发布的第一个和第二个资源使它看起来像 C++ 信号是内置在 C++11 中的,但是第三个链接中的教程似乎定义了自己的信号类,并且似乎没有使用第一个中的语法全部。
看起来其他项目以前也这样做过 (https://github.com/cinder/Cinder/issues/619),但我无法找到任何具体示例来显示前后比较 - 看到实现通常是点击理论的内容给我的地方。
来自驱动库头文件:
class InterfaceBase
{
InterfaceBase( const Config& cfg );
virtual ~InterfaceBase() { }
boost::signals2::signal<void (const InterfaceState& state)> signal_state_change;
}
来自驱动程序 cpp 文件:
void InterfaceBase::check_change_state()
{
if( state_ != previous_state )
{
signal_state_change( state_ );
}
}
来自模块 cpp:
template<typename Signal, typename Slot>
void connect( Signal* signal, Slot slot )
{ signal->connect( slot ); }
template<typename Signal, typename Obj, typename A1>
void connect( Signal* signal, Obj* obj, void( Obj::*mem_func )( A1 ))
{ connect( signal, boost::bind( mem_func, obj, _1 )); }
Interface::Interface()
{
if( cfg_.has_driver_lib_path() )
{
driver_library_handle = dlopen( cfg_.driver_lib_path().c_str(), RTLD_LAZY );
if( !driver_library_handle )
{
exit( EXIT FAILURE );
}
}
else
{
exit( EXIT_FAILURE );
}
driver_ = load_driver( &cfg_ );
connect( &driver_->signal_state_change, this, &Interface::ProcessStateChange );
}
驱动程序声明一个信号,它可以用来向加载它的模块发送数据,然后该模块将该信号绑定到一个函数,以便当调用该信号并向其提供数据时,数据会发送到那个功能。我只是想弄清楚如何在不使用 Boost 的情况下完成同样的事情,我想这意味着弄清楚如何替换 boost::bind。非常感谢任何指向正确方向的人;我会继续努力,如果我发现任何其他问题,我会发布,以防它对将来走同样道路的人有所帮助。
【问题讨论】:
标签: c++ boost signals boost-signals2