https://www.boost.org/doc/libs/1_68_0/doc/html/signals2.html
It provides a slightly nicer interface in that signals can be defined in a single template argument, vs. splitting args / return type as separate template arguments. For example:
boost::signals2::signal<void (float, float)> sig;
would allow the following function as a slots: void do_something(float x, float y) { ... }
There's also Qt's signal/slots implementation:
http://doc.qt.io/archives/qt-4.8/signalsandslots.htmlQt's approach requires a separate compilation pass woith a Qt-specific tool named "moc" which declares a bunch of info in the signal class that's necessary for the slot implementation.
IMO, the Boost implementation is nicer. It's vanilla C++ (no moc required), is thread safe, and supports some advanced features like "combiners".