Funktoren



  • Hi, aus einem listing der aktuellen C't habe ich folgendes,..

    struct Sum_A{
    int& m_value;
    Sum_A(int& value):m_value(value){}
    void operator()(const char* beg, const char* end) const
    {
    m_value+=std::strtol(beg,NULL,10);
    }
    };
    

    aufgerufen wird das ganze mit:

    Sum_A(zahl)
    

    Kann mir jemand bitte im DETAIL erklären wAs da genau passiert?
    dankööö



  • Zum einen ist dein Aufruf mit Sicherheit nicht der Aufruf, zum anderen spart die c't vielleicht Platz, aber ich gehe davon aus das sie dennoch den Code lesbarer als von dir hingeknallt geschrieben hatte.

    Ein Funktor ist ein Objekt das eine Funktionssyntax besitzt. Das heißt, das Objekt muss den ()-operator überladen haben. Das von dir genannte ist aber nur der Konstruktoraufruf.

    Kleines Beispiel:

    #include <iostream>
    
    struct A
    {
      A(int a)
      : value(a)
      {}
    
      operator()() const
      { std::cout << value << std::endl; }
    
      private:
        int value;
    };
    
    int main()
    {
      A a(3); // Konstruktor
      a();    // Funktoraufruf (operator () wird aufgerufen)
    }
    

    Der Operator () kann auch wie in deinen Beispiel Parameter haben. Nur bezweifel ich das dein Beispiel funktioniert (const deklarierte Methode, die einen Member ändert).

    cu André



  • Hmm durch den operator() kann man eine Objekt-Instanz fast wie eine Funktion nutzen, nur das du halt noch die Eigenschaften einer Klasse dir zu nutzen machen kannst!

    template<typename type>
    struct sum
    {
        // var to store current sum
        T& m_value;
        // Konstruktor to set destination for sum
        sum(T& value)
            : m_value(value)
        {}
        void operator()(T const& value) { m_value += value; }
    };
    

    So hätte das auch ein wenig mehr sin. Klar, man kann es auch zum Umwandeln von Strings in Zahlen und dann aufsummieren nutzen ... (wenn das original korrekt wäre ...)

    std::vector<int> data(1000, 33);
    int sum_data(0);
    std::for_each(data.begin(), data.end(), sum<int>(sum_data));
    std::cout << "Summe of \'data\' is " << sum_data << std::endl;
    

    ...



  • Das war der originale wortlaut aus der c't, s.185 (22.12.07)

    danke leutz



  • Hallo,

    bei mir steht da 🙂

    //einiges davor
    rule<> my_list_p = list_p(my_num_p[SumA(sum)], space_p );
    //einiges danach
    


  • zitat: aufgerufen wird das ganze mit :....
    😉

    gruß



  • Damit wird er aber immernoch nicht aufgerufen, sondern erzeugt. Aufgerufen wird er vom Parser beim parsen von my_num_p 😃


Anmelden zum Antworten