Netzflut

Webdesign, Webentwicklung, Drupal & Zeuchs

Funktoren

Inhaltsverzeichniss

    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.
        */
    Design&Code: