if, switch, funktionspointer für Optionen verwenden?



  • mccpfbn schrieb:

    Könnte ich die Lambadafunktion anderers definieren, so dass 42 ausgegeben wird? (ohne globale variablen)

    Klar, indem du die 42 der Funktion als Argument mitgibst oder als Attribut von Foo. Oder wenn dir nach Abenteuer zumute ist, indem du den Wert der lokalen Variable in main() direkt per Referenz oder Zeiger änderst.

    mccpfbn schrieb:

    Ja, auch bei drei wär doch dann das Problem. Ich müsste in dem Beispiel-for 1000000 überprüfen welche strategie gewählt wurde, obwohl sie für alle 1000000 gleich ist.

    Ah, verstehe. Wenn Performance wichtig ist, wäre mir das ein Dorn in Auge. Die zigfache Überprüfung kostet weniger als du vielleicht denkst, die Struktur des Codes kann aber u.U. weitere Optimierungen verhindern, die sonst möglich wären. Ab diesem Punkt kann man keine allgemeine Aussagen machen*, sondern muss das konkrete Problem kennen. Es ist vermutlich sinnvoll, die Funktion von Anfang an so auszulegen, dass beliebig große Batches pro Aufruf abgearbeitet werden. Solche Fallunterscheidungen werden dann nur ein einziges Mal gemacht.

    * eine allgemeine Aussage geht allerdings durchaus: es ist immer die Lösung zu wählen, bei der das Produkt aus Einfachheit (der inverse Arbeitsaufwand), Wartbarkeit und Performance maximal ist.



  • Dann müsste Foo alle potentiellen Parameter beinhalten, die je nach Wahl der Funktion zum größten Teil nicht gebraucht werden. Ich glaub ich muss mir was anders einfallen lassen. Aber danke an alle Helfer.

    Ich habe habe aber mal mit den Lambda Funktionen rumprobiert. Falls ich da auf lokale Variablen außerhalb der Funktion zugreifen will müssen die static sein. Gehen da auch welche die nicht static sind?



  • mal ein Beispiel:

    #include <iostream>
    
    class asdf
    {
        public:
    		int value;
    		asdf(int b){value=b+40;}
    
    		int (*getFunc())(int)
    		{
    			int (*test)(int a);
                //test  = [&value] (int a) -> int{ return a+value;  }; <--sowas in der art solls sein, geht nicht
    			test  = [] (int a) -> int{ return a;  }; //geht
    			return test;
    		}
    
    };
    
    int main(){
        asdf qwer(23);	
        int (*afun)(int a);
        afun = qwer.getFunc();
    	std::cout << afun(2) <<"\n";  //hier kommt 2 raus, soll aber 23+40 + 2 rauskommen
    }
    


  • Du versuchst zwischen Lamdas und Functionspointer zu konvertieren. Das geht soweit ich weiß nicht so ohne weiteres. (Weil Functionspointer den Lambda Capture nicht unterstützen.)

    Mach so was:

    #include <iostream>
    #include <functional>
    class asdf
    {
    public:
      int value;
      asdf(int b) { value = b + 40; }
    
      std::function<int(int)>getFunc()
      {
    
        auto test  = [this] (int a) -> int{ return a+value;  }; /
        return test;
      }
    
    };
    
    int main() {
      asdf qwer(23);
      auto afun = qwer.getFunc();
      std::cout << afun(2) << "\n";  
      std::cin.get();
    }
    


  • ;Rohan schrieb:

    ...
    Musst du auch nicht, denn auch wenn Javascript keine named parameters in der Reinform unterstützt, erfüllen Objekte in der Sprache hier exakt den gleichen Zweck.
    ...

    😃

    lg



  • Ich habe das auch mal gemacht um in einer Schleife eine ständige if- oder switch-Abfrage zu umgehen. Vor der Schleife wurde dann einmal festgelegt, in welche Funktion er springen soll.

    Hier mein Request: https://www.c-plusplus.net/forum/339800

    Das hier ist denke ich auch hilfreich für Dich: http://www.c-howto.de/tutorial-funktionen-teil2-zeiger-auf-funktionen.html


Anmelden zum Antworten