Funktion mit bestimmten Paramtern woanders aufrufen



  • Hallo, ich würde gerne eine Funktion mit bestimmten Parametern von einem anderen Objekt später aufrufen lassen. Ist das irgendwie möglich?
    Ich bin auf boost::function gestoßen aber damit erhalte ich nur einen Zeiger auf die Funktion und die Parameter müssen nochmal vom aufrufenden Objekt gesetzt werden.

    Also im groben:

    void klasse1::func1()
    {
      TypX zeiger = erzeuge Zeiger auf func2 mit Parameter 1 und 2
      klasse2::func3(zeiger)
    }
    
    void klasse1::func2(int a, int b)
    {
      int c = a + b;
    }
    
    void klasse2::doIt()
    {
      liste.front()->führeFunktionMitParameterAus()
    }
    
    void klasse2::addTypX(TypX zeiger)
    {
      liste.push_back(zeiger);
    }
    



  • Mod

    Dann stoß auch mal auf boost::bind.

    edit: Zu langsam.



  • Wenn dein "liste" ein STL-Container ist, und ich dein Vorhaben richtig deute, dann sollte das per Prädikat funktionieren was du möchtest.

    STL-Algorithmen

    Edith weiß noch zu sagen: Und wenn es kein STL-Container ist, wurde boost::bind ja schon gefunden. (auch zu langsam 🙄 )



  • Vielen Dank für die schnellen Antworten.

    Auf boost::bind bin ich vorher auch schon gestoßen aber wird die im bind definierte Funktion nicht bei der Übergabe schon direkt ausgeführt?

    Ich müsste ja das boost::bind in eine Liste speichern und zu einem späteren Zeitpunkt ausführen.



  • storm009 schrieb:

    Auf boost::bind bin ich vorher auch schon gestoßen aber wird die im bind definierte Funktion nicht bei der Übergabe schon direkt ausgeführt?

    Ich müsste ja das boost::bind in eine Liste speichern und zu einem späteren Zeitpunkt ausführen.

    Nein.. wird nicht direkt ausgeführt... genau dafür ist boost::bind!

    Edit:

    class klasse1;
    
    class klasse2
    {
    	typedef function<void()> function_t;
    
    public:
    	void doIt()
    	{
    		if (!liste.empty())
    			(liste.front())();
    	}
    
    	void addTypeX(function_t func)
    	{
    		liste.push_back(func);
    	}
    
    private:
    	std::list<function_t> liste;
    };
    
    class klasse1
    {
    	klasse2& xyz;
    
    public:
    	explicit klasse1(klasse2 &ref) : xyz(ref)
    	{
    	}
    
    	void func1()
    	{
    		xyz.addTypeX(bind(&klasse1::func2, this, 1, 2));
    	}
    
    	void func2(int a, int b)
    	{
    		int c = a + b;
    		std::cout << a << "+" << b << "=" << c << std::endl;
    	}
    };
    
    int main (void)
    {
    	klasse2 foo;
    	klasse1 bar(foo);
    	bar.func1();
    	foo.doIt();
    }
    


  • Super!!! Vielen Dank für das Beispiel.


Anmelden zum Antworten