Funktoren

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.
  1.         // Funktion
  2.     int square(int value)
  3.     {
  4.             return value * value;
  5.     }
  6.      
  7.     // Nutzung der Funktion
  8.     int result = square(2);
  9.      
  10.     /////////////////////////////////////////////777
  11.      
  12.     // Funktor
  13.     class square_functor
  14.     {
  15.     public:
  16.             // Konstruktor (das ist der Trick der es nachher wie eine Funktion aussehen läßt)
  17.             square_functor(int value)
  18.             {
  19.                     _param = value;
  20.             }
  21.      
  22.             int call()
  23.             {
  24.                     return square(_param);
  25.             }
  26.      
  27.     private:
  28.             int _param;                                     // die "konservierten" Parameter des Aufrufs
  29.     };
  30.      
  31.     // Nutzung des Funktors (sieht fast aus wie ein Funktionsaufruf)
  32.     square_functor functor = square_functor(2);
  33.      
  34.     // Irgendwann mal oder auch immer wieder:
  35.     int result = functor.call();
  36.      
  37.      
  38.     /*******************************************************************************
  39.             Beispiel: Undo für eine Malfunktion
  40.     *******************************************************************************/
  41.      
  42.     namespace image {
  43.      
  44.     // Imagebuffer ist einfach mal ein globales Array von Farben (egal wie color aussieht)
  45.     color buffer[WIDTH, HEIGHT];
  46.      
  47.      
  48.     color set_pixel(int x, int y, color value)
  49.     {
  50.             color old = buffer[x, y];
  51.             buffer[x, y] = value;
  52.      
  53.             return old;
  54.     }
  55.      
  56.     // Namespace für Funktoren der Malfunktionen (mit gleichem Namen)
  57.     namespace undo {
  58.      
  59.     // set_pixel Functor
  60.     class set_pixel
  61.     {
  62.     public:
  63.             set_pixel(int x, int y, color value)
  64.                     : _x(x)
  65.                     , _y(y)
  66.                     , _value(value)
  67.             {}
  68.      
  69.             color call()
  70.             {
  71.                     // Call the function with the stored parameters
  72.                     return ::set_pixel(_x, _y, _value);
  73.             }
  74.      
  75.     protected:
  76.             int _x, _y;
  77.             color _value;
  78.     };
  79.      
  80.      
  81.     }; // namespace undo
  82.     }; // namespace image
  83.      
  84.      
  85.     // Globaler Container für die Malschritte
  86.     std::vector<image::undo::set_pixel> undo_list;
  87.      
  88.      
  89.     // Diese Funktion wird aufgerufen wenn der Nutzer einen Pixel malt:
  90.     void on_set_pixel(int x, int y, color value)
  91.     {
  92.             color old = image::set_pixel(x, y, value);
  93.             undo_list.push_back(image::undo::set_pixel(x, y, old));
  94.     }
  95.      
  96.     void on_undo_pixel()
  97.     {
  98.             if(undo_list.empty())
  99.                     return;
  100.      
  101.             undo_list.back().call();
  102.             undo_list.pop_back();
  103.     }
  104.      
  105.     /*
  106.             Alles in allem ein einfach gehaltenes Beispiel mit etwas "gegebenem"
  107.             Pseudocode, das nur anregen soll.
  108.      
  109.             Da C++ eine streng typisierte Sprache ist und von Haus aus keine Variant-
  110.             Typen oder heterogene Container unterstützt, wird es hier erst mit
  111.             einer Factory oder Templates richtig interessant.
  112.      
  113.             In PHP, Javascript usw. kann man da leichter verschiedene Aktionen
  114.             sammeln und ausführen. Man kann einfach verschiedene Functoren
  115.             in ein Array packen und mit foreach bei allen call aufrufen.
  116.     */
Webdevelopment
Add new comment
The content of this field is kept private and will not be shown publicly.

Plain text

  • Allowed HTML tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <drupal-entity data-*>
  • Web page addresses and email addresses turn into links automatically.
  • Lines and paragraphs break automatically.