fork download
  1. #include <functional>
  2.  
  3. class Button
  4. {
  5. // Allgemeines Ding, das sich wie eine Funktion verhält, die void zurück gibt und keine Parameter hat:
  6. std::function<void()> f;
  7.  
  8. public:
  9. // Akzeptiert alles, was sich irgendwie void()-artig aufrufen lässt:
  10. template <typename T> void set_function(T t) { f = t; }
  11.  
  12. void invoke_function()
  13. {
  14. f();
  15. }
  16. };
  17.  
  18.  
  19. // von hier an dient alles nur der Demonstration:
  20. #include <iostream>
  21. using std::cout;
  22.  
  23. void void_funktion_ohne_parameter() { cout << "void_funktion_ohne_parameter\n"; }
  24.  
  25. void void_funktion_mit_parameter(int i) { cout << "void_funktion_mit_parameter: " << i << '\n'; }
  26.  
  27. struct Foo
  28. {
  29. void nicht_statische_memberfunktion_ohne_parameter() { cout << "nicht_statische_memberfunktion_ohne_parameter\n"; }
  30. void nicht_statische_memberfunktion_mit_parameter(int i) { cout << "nicht_statische_memberfunktion_mit_parameter: " << i << '\n'; }
  31. static void statische_memberfunktion() { cout << "Langweilig!\n"; }
  32. };
  33.  
  34. struct Functor
  35. {
  36. void operator()() { cout << "Functor\n"; }
  37. };
  38.  
  39. int main()
  40. {
  41. using std::bind;
  42.  
  43. Button button;
  44.  
  45. button.set_function(void_funktion_ohne_parameter); // Bei freien Funktionen kann man den Adressoperator auch weglassen
  46. button.invoke_function();
  47.  
  48. button.set_function(bind(void_funktion_mit_parameter, 5));
  49. button.invoke_function();
  50.  
  51. Foo foo;
  52.  
  53. button.set_function(bind(&Foo::nicht_statische_memberfunktion_ohne_parameter, &foo)); // Bei Memberfunktionen ist der Adressoperator nötig
  54. button.invoke_function();
  55.  
  56. button.set_function(bind(&Foo::nicht_statische_memberfunktion_mit_parameter, &foo, 5));
  57. button.invoke_function();
  58.  
  59. button.set_function(Foo::statische_memberfunktion); // Statische Memberfunktionen sind auch nicht anders als freie Funktionen mit besonderem Namen.
  60. button.invoke_function();
  61.  
  62. button.set_function(Functor()); // ALLES was irgendwie wie void() aufrufbar ist funktioniert
  63. button.invoke_function();
  64.  
  65. button.set_function([](){cout<<"Lambda\n";}); // Das ist insbesondere praktisch für Lambdas
  66. button.invoke_function();
  67. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
void_funktion_ohne_parameter
void_funktion_mit_parameter: 5
nicht_statische_memberfunktion_ohne_parameter
nicht_statische_memberfunktion_mit_parameter: 5
Langweilig!
Functor
Lambda