Webdevelopment
Drupal
Betriebssysteme
Design
Sonstige
Do., 20/09/2012 - 19:21
Body
Funktoren (c++ Beispiel)
Beispiel, grob. Wird in Jquery recht häufig benutzt (im core). Der Functor hat eine Funktion call die man irgendwann später mal aufrufen kann. Man kann die ganzen variablen die ja Funktionen enthalten in einem Array speichern. Damit kann man z.B. undo-Listen machen. Danke an Frank.- // Funktion
- int square(int value)
- {
- return value * value;
- }
- // Nutzung der Funktion
- int result = square(2);
- /////////////////////////////////////////////777
- // Funktor
- class square_functor
- {
- public:
- // Konstruktor (das ist der Trick der es nachher wie eine Funktion aussehen läßt)
- square_functor(int value)
- {
- _param = value;
- }
- int call()
- {
- return square(_param);
- }
- private:
- int _param; // die "konservierten" Parameter des Aufrufs
- };
- // Nutzung des Funktors (sieht fast aus wie ein Funktionsaufruf)
- square_functor functor = square_functor(2);
- // Irgendwann mal oder auch immer wieder:
- int result = functor.call();
- /*******************************************************************************
- Beispiel: Undo für eine Malfunktion
- *******************************************************************************/
- namespace image {
- // Imagebuffer ist einfach mal ein globales Array von Farben (egal wie color aussieht)
- color buffer[WIDTH, HEIGHT];
- color set_pixel(int x, int y, color value)
- {
- color old = buffer[x, y];
- buffer[x, y] = value;
- return old;
- }
- // Namespace für Funktoren der Malfunktionen (mit gleichem Namen)
- namespace undo {
- // set_pixel Functor
- class set_pixel
- {
- public:
- set_pixel(int x, int y, color value)
- : _x(x)
- , _y(y)
- , _value(value)
- {}
- color call()
- {
- // Call the function with the stored parameters
- return ::set_pixel(_x, _y, _value);
- }
- protected:
- int _x, _y;
- color _value;
- };
- }; // namespace undo
- }; // namespace image
- // Globaler Container für die Malschritte
- std::vector<image::undo::set_pixel> undo_list;
- // Diese Funktion wird aufgerufen wenn der Nutzer einen Pixel malt:
- void on_set_pixel(int x, int y, color value)
- {
- color old = image::set_pixel(x, y, value);
- undo_list.push_back(image::undo::set_pixel(x, y, old));
- }
- void on_undo_pixel()
- {
- if(undo_list.empty())
- return;
- undo_list.back().call();
- undo_list.pop_back();
- }
- /*
- Alles in allem ein einfach gehaltenes Beispiel mit etwas "gegebenem"
- Pseudocode, das nur anregen soll.
- Da C++ eine streng typisierte Sprache ist und von Haus aus keine Variant-
- Typen oder heterogene Container unterstützt, wird es hier erst mit
- einer Factory oder Templates richtig interessant.
- In PHP, Javascript usw. kann man da leichter verschiedene Aktionen
- sammeln und ausführen. Man kann einfach verschiedene Functoren
- in ein Array packen und mit foreach bei allen call aufrufen.
- */
Webdevelopment
Add new comment