Boost logo

Boost :

Subject: Re: [boost] Interest in non-intrusive signal/slot lib?
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2015-05-20 09:13:06


Le 12/05/15 04:25, Emil Dotchevski a écrit :
> Hello,
>
> I realize that Boost has Signals library already, but I've implemented a
> non-intrusive one which approaches the problem differently, and I'm pretty
> sure that there is no overlap between the two. It turned out more generic
> than I originally anticipated, so I thought I'd ask if others would find it
> useful as well.
>

I have some concerns about the lifetime of the emitters.

E.g. an application can have a class that contains a several possible
emitters. The lifetime of all the emitters depends on the lifetime of
the C instance.

struct C {
     T1 e1;
     T2 e2;
};

int main() {

     shared_ptr<C> c = make_shared<C>();
     // ...

The lifetime of emitters c->e1 and c->e2 is managed by c.

Now I would like to connect to c->e1 and/or c->e2. But I would need to
change the class C, as I don't have a shared_ptr to &(c->e1) or &(c->e2).

Do you have a solution without changing C? If not, could your library
take care of this use case? IMO this will reduce the need for more
shared_ptr than really needed.

Maybe a connect_member

auto c1 = connect_member<button_clicked, C, T1, &C::e1>(c , ...);
auto c2 = connect_member<button_clicked, C, T2, &C::e2>(c, ...);

or splitting the responsabilities of emitter lifetime tracker and the
emitter itself

auto c1 = connect<button_clicked>(c, c->e1, ...);
auto c2 = connect<button_clicked>(c, c->e2, ...);

Maybe having a smart pointer that give access to a member pointer of a
shared_ptr/weak_ptr

template <class C, class T, T C::*>
class member_shared_ptr;
template <class C, class T, T C::*>
class member_weak_ptr;

could allow to overload the connect function

auto c1 = connect<button_clicked>(member_shared_ptr<C, T1, &C::e1>(c), ...);
auto c2 = connect<button_clicked>(member_shared_ptr<C, T2, &C::e2>(c), ...);

The class C could be defined as follows to make explicit that the
instances are shared and provide access to shared emitters

struct C : shared_from_this {
     T1 e1_;
     T2 e2_;
public:
     shared_ptr<C> make();
     member_shared_ptr<C, T1, &C::e1> e1_emitter() { return
member_shared_ptr<C, T1, &C::e1>(share_from_this()); }
     member_shared_ptr<C, T2, &C::e2> e2_emitter(){ return
member_shared_ptr<C, T2, &C::e2>(share_from_this()); }
};

auto c = C::make();
auto c1 = connect<button_clicked>(c->e1_emitter(), ...);
auto c2 = connect<button_clicked>(c->e2_emitter(), ...);

Vicente


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk