Search code examples
c++libsigc++

How does libsigc++ convert a function into a slot?


I'm working with some basic signal code, and I can't figure out how this function is passed in as an argument. I came across this code in the libsigc++ tutorial:

AlienDetector mydetector;
mydetector.signal_detected.connect( sigc::ptr_fun(warn_people) );

AlienDetector has this member variable:

sigc::signal<void> signal_detected;

And warn_people is a function with a simple print statement:

void warn_people() { printf("They're here!\n"); }

Is there an example in the standard library of using a function like this? How does the compiler understand to "look for" the function that is being passed in?


Solution

  • It use a function pointer. Wikipedia has some sample code in C: https://en.wikipedia.org/wiki/Function_pointer#Example_in_C

    Function pointers are useful when the actual function to call might not be known until runtime. For instance:

    typedef void (*callback_func)(int);
    callback_func foo_func;
    
    void set_foo_func(callback_func callback) {
      foo_func = callback;
    }
    
    void call_foo_func() {
      foo_func(5);
    }
    
    void my_func(int a) {
       ...
    }
    
    int main() {
       set_foo_func(my_func);
       call_foo_func();
    
       return EXIT_SUCCESS;
    }
    

    Dereferencing is optional (or meaningless, depending on how you think about it) and I personally prefer it:

    void call_foo_func() {
      (*foo_func)(5);
    }
    
    set_foo_func(&my_func);
    

    That's just for a static function. It's a little more complicated for member functions. And libsigc++ has lots of very complicated code to do lots of useful things.