Ну, если бы у вас были библиотеки Boost или компилятор с поддержкой C ++ 0x, вы могли бы иметь такой код:
#include <cstdio>
#include <functional>
struct Foo
{
std::function<void ()> handler;
void invoke ()
{
if (handler)
{
handler ();
}
else
{
printf ("Oops, handler is not there!\n");
}
}
};
static void myHandler1 (int arg)
{
printf ("Handler #1 (arg=%d)\n", arg);
}
static void myHandler2 ()
{
printf ("Handler #2\n");
}
int main ()
{
Foo f;
f.invoke ();
f.handler = std::bind (&myHandler1, 13);
f.invoke ();
f.handler = &myHandler2;
f.invoke ();
}
Приятно то, что вы можете иметь функции илифункторы, связанные с обработчиком с необязательными дополнительными аргументами.
Ваш оригинальный код также будет работать, но что если я хочу вызвать метод класса, а не простую функцию?Что, если я хочу также передать какое-то состояние, к которому я могу получить доступ внутри обработчика, когда он вызывается?Это одна из многих причин, по которым std::function
сделал это стандартом C ++.