If Abfrage verbessern



  • Hallo!
    Ich habe in meinem Code folgende If Abfrage(Vereinfacht):

    if(a>b) {
    	Foo1(b);
    	Foo2();
    }
    else if(a<c) {
    	Foo1(c);
    	Foo2();
    }
    

    Das Foo2() wird ja ausgeführt, wenn (a>b || a<c) gilt.
    Kann ich das Foo2() irgendwie "ausklammern" ohne noch ein if einzufügen?

    Sowas habe ich nicht so selten im Code und es würde schon ne menge Zeilen einsparen.

    Dankeschön!



  • if (a>b || a<c) {
        if(a>b) Foo1(b);
        else    Foo1(c);
        Foo2();
    }
    

    Platz- und zeitoptimierter Code:

    if      (a>b) Foo1(a);
    else if (a<c) Foo1(c);
    else return/break/goto mark;
    Foo2();
    

    Alternativ kannst du das in einem Makro verstecken (meine Vorschläge werden immer schlimmer)

    #define nonelse(code)         \
            else goto makro_mark; \
            code;                 \
          makro_mark:
    
    if (a>b) {
        Foo1(b);
    }
    else if(a<c) {
        Foo1(c);
    }
    nonelse(
        Foo2();
    )
    

    Nein, lass das lieber.

    Wenn vieles wiederholt auftritt, dann lager das mit einer inline-Funktion aus.



  • void Foo1(...)
    {
       ...
       Foo2();
    }
    
    if(a>b) {
    	Foo1(b);
    }
    else if(a<c) {
    	Foo1(c);
    }
    


  • Danke für die Vorschläge. Im moment hab ich das goto im code stehen. Das Makro ist mir zu fischig.

    @Belli:
    Das sieht nach der saubersten Lösung aus, aber bei mir ist Foo2() lokal gebunden, weils eine Memberfunktion einer Klasse ist. Dann müsste ich die Klasse also mit an Foo1() übergeben. Ist das Sinnvoll?



  • Wenn man schon auf Makros zurückgreift, kann man zumindest die goto-Fummelei sein lassen:

    #define FOO1(x) { \
      Foo1(x); \
      Foo2(); \
    }
    
    if(a > b) {
      FOO1(b);
    } else if(a < c) {
      FOO1(c);
    }
    

    Ansonsten sieht mir das so aus, als seien b und c Bereichsbegrenzungen. Wild geraten unter der Annahme, dass c <= b:

    int v = std::min(b, std::max(a, c)); // bzw. statt int betreffender Datentyp
    
    if(v != a) {
      Foo1(v);
      Foo2();
    }
    


  • c++ Guy schrieb:

    Das sieht nach der saubersten Lösung aus, aber bei mir ist Foo2() lokal gebunden, weils eine Memberfunktion einer Klasse ist. Dann müsste ich die Klasse also mit an Foo1() übergeben. Ist das Sinnvoll?

    pffff ... Du meinst, Du mußt das passende Objekt mitübergeben? Naja, das muß ja auch schon irgendwie in den Kontext gekommen sein, wo Du Foo2 jetzt aufrufst. Es macht natürlich nur dann Sinn, wenn anschließend an Foo1 IMMER Foo2 aufgerufen werden soll, das kann ich Deinem kleinen Code-Schnipsel nicht entnehmen. Es ist halt eine Möglichkeit, ob sie Sinn in Deinem Projekt macht, mußt Du selbst entscheiden.
    Wie gesagt, Du kannst dann natürlich nicht mehr (ohne weiteres) von irgendeiner Stelle Foo1 aufrufen, OHNE daß im Anschluß Foo2 aufgerufen wird ...



  • c++ Guy schrieb:

    Hallo!
    Ich habe in meinem Code folgende If Abfrage(Vereinfacht):

    if(a>b) {
    	Foo1(b);
    	Foo2();
    }
    else if(a<c) {
    	Foo1(c);
    	Foo2();
    }
    

    Ich finde das ist von allen gezeigten Möglichkeiten immer noch die sauberste. Das einzige was man hier noch ändern könnte, wenn solche Stellen mehr als nur 1-2 mal auftreten: eine Funktion (kein Makro) machen die Foo1 und Foo2 hintereinander aufruft:

    void Foo12(T x)
    {
        Foo1(x);
        Foo2();
    }
    
    // ...
    
    if(a>b)
    	Foo12(b);
    else if(a<c)
    	Foo12(c);
    

    Alles andere schadet IMO mehr als es hilft.



  • c++ Guy schrieb:

    Sowas habe ich nicht so selten im Code...

    Ich nicht. Wann braucht man sowas?


Anmelden zum Antworten