#include <sigc++/adaptors/bind.h>
#include <sigc++/signal.h>
#include <sigc++/slot.h>
#include <sigc++/trackable.h>

#include <iostream>

#include <unistd.h>


class Foo : public sigc::trackable
{
public:
   void Callback(sigc::slot<void> doFooSlot)
   {
      doFooSlot();
   }

   void DoFoo()
   {
      std::cout << "Do Foo" << std::endl;
   }
};


int main()
{
   Foo *foo = new Foo();

#if USE_WORKAROUND
   sigc::slot<void> two =
      sigc::mem_fun(foo, &Foo::DoFoo);
   sigc::slot<void> fooSlot =
      sigc::bind(sigc::mem_fun(foo, &Foo::Callback),
                 two);
#else
   sigc::slot<void> fooSlot =
      sigc::bind(sigc::mem_fun(foo, &Foo::Callback),
                 sigc::mem_fun(foo, &Foo::DoFoo));
#endif

   sigc::signal<void> sig;
   sig.connect(fooSlot);

   sig.emit();

   delete foo;

   return 0;
}
