Funktionsobjekte



  • Hi!

    Hab folgende Klasse und Funktion:

    class I2S
    {
    
    public:
    
    	void operator() (int &i)
    	{
    		printf(">>> %d\n",i);
    	}
    
    };
    
    void for_each(multiset<int>::iterator &a, multiset<int>::iterator &b, void(*func)(int&))
    {
    	while(a!=b)
    	{
    		func(*a);
    		a++;
    	}
    
    }
    

    Nun sollte sich eigtl Folgendes realisiern lassen:

    I2S i2s;
    
    for_each(iter1, iter2, i2s);
    

    da ja I2S den () operator überlädt und somit in for_each einsetzbar sein sollte.
    Geht aber net - der Compiler meint hier dass der 2. Parameter eben vom Typ void (__cdecl *)(int &)' und nicht der Klasse IS2 sein sollte.

    Laut meiner Unterlagen sollte es aber gehen!

    Was mach ich falsch ?!



  • blackwinged schrieb:

    Was mach ich falsch ?!

    Deine for_each Funktion erwartet einen Funktionszeiger.
    Davon ab, schon mal was von std::for_each gehört?



  • edit: Wo wir gerade schon dabei sind, cout?



  • jau, weiß ich ja alles 😉

    1. war es teil der aufgabe, for_each zu realisieren
    2. sollten Funktoren benutzt werden (Funktionsobjekte)

    so - in dem Beispiel hieß es, man könne ein Objekt der Klasse einsetzen, da die Klasse () überlädt und somit diese Methode übergeben wird.

    eine Funktion void print(int& i) könnte ja auch übergeben werden

    grüße
    blackw



  • Versuch's mal so:

    template<typename FUNC>
    void for_each(multiset<int>::iterator &a,
                  multiset<int>::iterator &b,
                  FUNC f)
    {
      while(a!=b)
      {
        f(*a);
        ++a;
      }
    }
    

    Jetzt noch die Iteratoren als Templateparameter und du hast mehr oder weniger std::for_each nachgebaut 😉

    blackwinged schrieb:

    so - in dem Beispiel hieß es, man könne ein Objekt der Klasse einsetzen, da die Klasse () überlädt und somit diese Methode übergeben wird.

    Das ist bei Templates der Fall, wo die Funktion/der Funktor jeweils "aufrufbar" sind. In deinem Versuch erwartet for_each jedoch explizit einen Funktionszeiger.


Anmelden zum Antworten