Seite 1 von 1

leicht unterschiedliche Funktionen

Verfasst: Sa Aug 27, 2016 2:27 pm
von win8789
Hallo,
in letzter Zeit passiert es öfters, dass ich zwei Funktioen erstelle, welche sich nur leicht in sehr wenigen Details unterscheiden.

Wenn das passiert, wende ich meistens eine bool mit einem Default-Value am, um letztendich nur eine Funktion zu haben (die Details befinden sich in einer if-Bedungung (deshalb der bool)).

Die Frage die mich mir dabei stelle ist: Wie gut ist diese herangehungsweise und gibt es besser Alternativen?


ps. Ich rede hierbei nicht von unterschiedliche Datentypen, wo man einfach ein Template verwenden könnte.

pps. mir ist bewusst, dass man mit Templates auch viel, viel mehr anstellen kann als einfach nur Datentypen "beliebig" zu machen.

Re: leicht unterschiedliche Funktionen

Verfasst: So Aug 28, 2016 7:37 am
von Xin
win8789 hat geschrieben:Hallo,
in letzter Zeit passiert es öfters, dass ich zwei Funktioen erstelle, welche sich nur leicht in sehr wenigen Details unterscheiden.

Wenn das passiert, wende ich meistens eine bool mit einem Default-Value am, um letztendich nur eine Funktion zu haben (die Details befinden sich in einer if-Bedungung (deshalb der bool)).
Das ist eine Möglichkeit.
win8789 hat geschrieben:Die Frage die mich mir dabei stelle ist: Wie gut ist diese herangehungsweise und gibt es besser Alternativen?
Das Bool sollte aber semantisch passen. Heißt: Wenn die Funktion in beiden Fällen die gleiche Funktion mit marginalem Unterschied macht.
Schreibt man eine größere Funktion (oder braucht die Performanz), kann man die Unterschiede auch in ein Trait auslagern und die Funktion als Template ausführen, das sich die Unterschiede aus dem Trait beschafft. Der Vorteil ist hier, dass die Sachen auskompiliert werden, also nicht mehr zur Laufzeit abgefragt werden und das Bool täuscht keine semantische Ähnlichkeit mehr vor, die eventuell gar nicht besteht, wenn eine Funktion zwar einen ähnlichen Algorithmus, aber eine ganze andere Funktion beherbergt.

Das Bool wandert damit an das template.
myfunc< OptionA >( int a, int b );
bzw.
myfunc< Optionb >( int a, int b );

und so kann es natürlich beliebig viele Optionen geben.

Re: leicht unterschiedliche Funktionen

Verfasst: Mo Okt 10, 2016 9:57 pm
von Necip
Hast Du dich schon einmal mit virtuellen Funktionen beschäftigt?

Code: Alles auswählen

class Base {
  int exec(void) {
    // Gemeinsame Funktion
    fn (); // Spezielle Funktion
    }

   virtual int fn(void) = 0; // reine virtuelle Funktion

}


class FunctionA : public Base {
   virtual int fn (void) {
     // Spezialbehandlung
     return 1;
     }
}

class FunctionB : public Base {
   virtual int fn (void) {
     // Spezialbehandlung
     return 0;
     }
}


main () {

  FunktionA a;
  FunktionB b;

  a.exec();
  b.exec();
  }