Am 04.12.2016 um 11:45 schrieb Emil Dotchevski:
On Sat, Dec 3, 2016 at 10:07 AM, Klemens Morgenstern < klemens.morgenstern@gmx.net> wrote:
Am 03.12.2016 um 18:56 schrieb Peter Dimov:
Klemens Morgenstern wrote:
But really having a void* as part of a public interface would've given
you a no, even if everything else was perfect with this library.
This objection of yours doesn't make much sense to me. What problem are you trying to prevent? Objects of different types don't typically share the same address, so type safety can hardly be violated. Well, I suppose you could use the wrong member of a union by mistake.
Or a boost.variant.
In Synapse, emitters are identified by their address, so union members represent the same emitter, by definition. Even if somehow the type of the emitter participated in its identifier, you'd have the same problem in case of union members of the same type.
Or you could just by coincidence have a new object at the address of an old one, long after it has been deleted - which is actually easy to do, since you can put the objects that emit on the stack.
Use shared_ptr with null deleter and weak_ptr to avoid that. See "Emitter lifetime safety" in http://zajo.github.io/boost-synapse/Tutorial.html.
Alright, tell me if this code works properly.
class
my_button
{
....
void
emit_button_clicked()
{
synapse::emit