|
Boost : |
From: Jody Hagins (jody-boost-011304_at_[hidden])
Date: 2004-11-24 23:19:05
On Wed, 24 Nov 2004 11:57:55 -0500
Doug Gregor <dgregor_at_[hidden]> 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]);
}
}
}
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk