std.signals2 proposal
Zhenya
zheny at list.ru
Mon Nov 5 11:34:20 PST 2012
On Monday, 5 November 2012 at 19:07:13 UTC, Robert wrote:
>
>> Hi!Could you write some examples for struct and non-object
>> delegates?
>>
>
> Sure!
>
> Something like:
>
> struct Observer {
> void observe(int a, int b) {
> // ...
> }
> }
>
> void main() {
> Signal!(int, int) s1;
> Signal!int s2
> Observer o;
> s1.connect!Object(null, (null_object, a, b) => o.observe(a,
> b));
> s2.connect!Object(null, (null_object, a) => o.observe(7, a));
>
> }
>
> Having the delegate accept a null parameter might not be
> pretty, but I
> consider this a good thing, because of the changed semantics:
> The signal
> will keep a reference to the struct now, so the signals weak
> reference
> semantics are no longer in place. (If struct is allocated on
> the heap,
> it won't be freed as long as the signal is alive.)
> But it is possible and safe. And if you know what you are doing
> also
> very reasonable.
>
> But the main benefit is not that you can connect to structs
> (which is a
> side effect), but that you can use wrapping delegates which do
> parameter
> adoptions. That's the killer feature that proved to be so
> indispensable
> and neat for me and others.
>
> If really required it would not be to hard to provide an
> overload of
> connect() which takes a struct pointer directly, just like the
> one
> taking an object, but because of the changed semantics and the
> rare uses
> I'd expect, probably not worthwhile. But comments are
> appreciated.
I am embarrassed a little that a member function of the structure
looks like a static function,maybe it would be better if connect
took struct pointer directly.I think if struct become immortal it
will not be a big trouble,in other
case we have disconnect,that will help us.
Sorry for my awful english
More information about the Digitalmars-d
mailing list