
On Wed, 24 Nov 2004 11:57:55 -0500 Doug Gregor <dgregor@cs.indiana.edu> wrote:
On Nov 24, 2004, at 9:31 AM, Jody Hagins wrote:
In any event, how do you suggest I "replace" a conected slot, while still guaranteeing that the "connection" is invoked exactly once?
Oh, yuck. This is something the signals interface just can't handle...
suggestions are welcome.
OK, I made a brief attempt. Diffs (diff -rc) are attached if you want to take a look... Basically... 1. added template typed_connection, which inherits from connection, so that a connection object can know the type of the signal (and ultimately the slot). This new class has a replace_slot() method that will replace the slot of the connection. 2. added a free function signals::detail::replace_slot() which mucks around with the internals and swaps out the slot in the connection with a new slot. 3. changed the return type of connect() to be the exact connection type. This should remain backward compatible since the return type used to be connection. Here is a simple example... #include "boost/signals.hpp" #include "boost/bind.hpp" #include <iostream> struct slot { slot( boost::signal<void (char const *)> & sig) : conn_(sig.connect(boost::bind(&slot::one, this, _1))) { } void one(char const * s) const { std::cout << "one()(" << s << ")\n"; conn_.replace_slot(boost::bind(&slot::two, this, _1)); } void two(char const * s) const { std::cout << "two()(" << s << ")\n"; conn_.disconnect(); } operator bool() const { return conn_.connected(); } boost::signal<void (char const *)>::connection_type conn_; }; int main( int argc, char * argv[]) { boost::signal<void (char const *)> sig; for (int i = 1; i < argc; ++i) { slot s(sig); while (s) { sig(argv[i]); } } }