From ist ein rückwärts gerichtetes Casting.
Ein Casting mit to oder as kann einen temporären Wert erzeugen, der an eine Funktion übergeben werden kann.
print a$;
In Fällen wie diesen hilft das aber nicht:
virtual bool position( double pos, Point3d& result ) const override;
virtual bool position( double pos, Alignment& result ) const override
{
Point3d temp;
if( position( pos, temp ))
{
result = Alignment( temp );
return true;
}
return false;
}
Man muss das Ergebnis also zwischenspeichern. Mit from wird ein temporäres Objekt erzeugt, das beschrieben werden darf und nach Ausführung vernichtet wird.
virtual bool position( double pos, Point3d& result ) const override;
virtual bool position( double pos, Alignment& result ) const override
{
return position( pos, result from Point3d ))
}
Bei einer Referenz muss Alignment per as oder to oder construct auf Point3d transformierbar sein. Das Ergebnis geht in die Funktion, und kann dort verändert werden. Nach dem Aufruf der Funktion wird das (möglicherweise veränderte) temporäre Objekt wieder auf Alignment zugewiesen - entweder durch operator from(Point3d &&) oder - falls nicht vorhanden - durch operator : (Point3d&&).
Operator from sollte hierbei ausschließlich Point3d überschreiben und keine weiteren Member. operator = kann beliebig definiert werden. operator from kann damit implizit erzeugt werden, sollte aber verboten oder überschrieben werden können.