C++Guns – RoboBlog

09.03.2017

C++17 Guns - std::optional

Filed under: Allgemein — Tags: — Thomas @ 13:03

Ich glaube, ich sehe einen Verwendungszweck für std::optional.
Ein hydraulischer Schacht kann mehrere Punkte besitzen. Z.B. für Schachtdeckel (DMP) und Schachtmittelpunkt (SMP). Nun sind Datensätze nie vollständig, und ich muss mit beiden Punkthöhen weiter rechnen, wenn sie denn existieren. Das lässt sich natürlich leicht über ein boolean hasDMP realisieren. Und einer Schleife die über alle Punkte läuft. Natürlich will niemand im Code 100x die selbe Schleife schreiben. Es würde auch dem "WAS und nicht WIE" Prinzip widersprechen. Also wird die Schleife in eine Funktion ausgelagert. Die Schleife gibt den Punkt zurück und ein boolen, ob der Punkt auch existiert.


auto [DMP, hasDMP] = schacht.DMPpunkt();
auto [SMP, hasSMP] = schacht.SMPpunkt();
if(hasDMP and hasSMP) {
    distanceTo(DMP, SMP);
}

Ist ganz nett, und durch das "auto" auch relativ kurzer Code. Aber es geht mit std::optional wohl noch kürzer. Möglicherweise so:


auto DMP = schacht.DMPpunkt();
auto SMP = schacht.SMPpunkt();
if(DMP and SMP) {
    distanceTo(DMP, SMP);
}

Ist hier die Semantik zu abstrakt? Ist intuitiv klar was if(DMP) bedeutet? Der Typ der DMP und SMP Variabel ist schon variabel. Das ist schon brainfuck für viele C++ Programmierer aber lustigerweise Schokolade für die Python Programmierer. Aber jetzt ist sogar die Existenz der Variabel variabel.

Und wie sieht es mit der Performance aus? Kann std::optional so implementiert werden, dass kein new() aufgerufen wird?

Nachteil: Höhere Laufzeit, da zwei mal die Schleife gestartet wird. Vorschlag: tupel Schacht::punkte(Args...) Hm?

No Comments »

No comments yet.

RSS feed for comments on this post.

Leave a comment

You must be logged in to post a comment.

Powered by WordPress