Я работаю с базовым сигнальным кодом и не могу понять, как эта функция передается в качестве аргумента. Я наткнулся на этот код в учебник по libsigc ++:
AlienDetector mydetector;
mydetector.signal_detected.connect( sigc::ptr_fun(warn_people) );
AlienDetector имеет эту переменную-член:
sigc::signal<void> signal_detected;
И warn_people — это функция с простым оператором print:
void warn_people() { printf("They're here!\n"); }
Есть ли в стандартной библиотеке пример использования такой функции? Как понимает компилятор, чтобы «искать» переданную функцию?
Он использует указатель на функцию. В Википедии есть пример кода на C: https://en.wikipedia.org/wiki/Function_pointer#Example_in_C
Указатели на функции полезны, когда действительная функция для вызова может быть неизвестна до времени выполнения. Например:
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;
}
Разыменование является необязательным (или бессмысленным, в зависимости от того, как вы к этому относитесь), и я лично предпочитаю:
void call_foo_func() {
(*foo_func)(5);
}
set_foo_func(&my_func);
Это только для статической функции. Это немного сложнее для функций-членов. А в libsigc ++ есть много очень сложного кода, чтобы делать много полезных вещей.