Rückgabewert für "Keine Lösung"



  • Ok, das scheint mir für viele Fälle die "schönste" Lösung zu sein. Danke für die Antworten.



  • Nexus schrieb:

    Kann man sich die überhaupt sparen? Denn es muss ja ein anderer Ablaufpfad eingeschlagen werden, abhängig davon, ob die Funktion Nullstellen hat oder nicht. (Ich möchte jetzt nicht auf If-Workarounds wie Funktionszeiger oder sowas hinaus).

    Wenn man z.B. mehrere Rueckgabewerte hat, dann will man diese fuer gewoehlich weiterverarbeiten. Tu was mit allen Nullstelln, Tu was mit allen Matches des regulaeren Ausdrucks, ... Im einfachsten Fall moechte man diese erst mal ausgeben, also for*( it = matches.begin(); it != matches.end(); ++it)* oder mittels std::for_each(...). Ist jetzt der Container aber leer, so passiert gar nichts. Bei der Variante mit expliziten Rueckgabewert, std::pair oder boost::optional muss dieser erst geprueft werden. Diese Pruefung ist natuerl auch in der Variante mit for enthalten, aber sie ist implizit und muss nicht hingeschrieben werden. Und bei allem, was ich nicht dasteht, kann ich auch keine Fehler machen. Der Code hat etwas weniger Rauschen (Laerm, noise). Performanceunterschiede wird es wohl nicht geben.



  • pumuckl schrieb:

    Frager schrieb:

    Was ist mit boost::optional?

    Das ist genau für solche Fälle gemacht 🙂

    Mag sein, aber es ist verboostelt und damit für mich indiskutabel.
    Außerdem wollte ich einen CONTAINER, also mit begin() und end() bzw mit content().



  • volkard schrieb:

    Mag sein, aber es ist verboostelt und damit für mich indiskutabel.

    Klingt nach ner emotionalen Entscheidung, die imo nichts bei der Wahl der Mittel für sowas zu suchen hat. Es sei denn "verboostelt" heißt sowas wie "zu allgemein und daher mit performance-overhead".

    volkard schrieb:

    Außerdem wollte ich einen CONTAINER, also mit begin() und end() bzw mit content().

    Der OP wollte aber keinen Container sondern nur eine Möglichkeit, zusätzlich zur Menge der möglichen einzelnen Lösungen den Wert "keine Lösung" auszudrücken. Von begin(), end() etc. war nie wirklich die Rede.



  • pumuckl schrieb:

    volkard schrieb:

    Mag sein, aber es ist verboostelt und damit für mich indiskutabel.

    Klingt nach ner emotionalen Entscheidung, die imo nichts bei der Wahl der Mittel für sowas zu suchen hat. Es sei denn "verboostelt" heißt sowas wie "zu allgemein und daher mit performance-overhead".

    volkard schrieb:

    Außerdem wollte ich einen CONTAINER, also mit begin() und end() bzw mit content().

    Der OP wollte aber keinen Container sondern nur eine Möglichkeit, zusätzlich zur Menge der möglichen einzelnen Lösungen den Wert "keine Lösung" auszudrücken. Von begin(), end() etc. war nie wirklich die Rede.

    volkard schrieb:

    Frager schrieb:

    Würdest du auch einen Container verwenden, wenn maximal 1 Element zurückgegeben wird?

    Wäre mir mit Standard-Containern zu teuer.
    Aber ich muß es mal testen. Einen Container für 0 oder 1 Element habe ich noch rumliegen.

    Frager schrieb:

    volkard schrieb:

    Einen Container für 0 oder 1 Element habe ich noch rumliegen.

    Was ist mit boost::optional?

    pumuckl schrieb:

    Frager schrieb:

    Was ist mit boost::optional?

    Das ist genau für solche Fälle gemacht 🙂

    Klingt danach, als sei boost genau für solche Fälle gemacht, wo man einen kleinen Container haben will.



  • volkard schrieb:

    Klingt danach, als sei boost genau für solche Fälle gemacht, wo man einen kleinen Container haben will.

    Du hast den Container aufgebracht mit dem Argument dass später irgendwann mal eh mehrere Ergebnisse zurückgegeben werden müssten.
    boost::optional ist eben kein wirklicher container (was du ja bemängelt hast, weils kein begin() und end() dabei ist), sondern eine Lösung für die Situationen wo ein Container overkill wäre.



  • Ich trage nach, daß darüberhinaus ein Container recht sinnig ist, weil er auf natürliche Weise ausdrückt, daß es keine oder eine Lösung gibt. So, wie man im Schulunterricht immer eine Lösungsmenge, die gegebenenfalls leer ist, als Ergebnis hinschreiben soll.



  • Einen echten Container ala vector zu verwenden wäre in diesem Fall (Schnittpunkt zweier Geraden ermitteln) eine schwere Performance-Sünde.

    boost::optional ist etwas besser.

    std::pair<bool, int> bzw. die Variante die das Ergebnis per Output-Parameter zurückgibt sind vermutlich für diesen speziellen Fall die "besten" Lösungen.



  • Nicht vergessen, dass es auch unendlich viele Nullstellen geben kann 🙂



  • Den Punkt oder "NULL" zurück geben


Anmelden zum Antworten