Motivation - in abstrakte Mathematik können wir 3-dimensionale Kreuzprodukt zu n Dimensionen verallgemeinern, unter der Annahme, dass für zwei Vektoren v,w
der Dimension n
, ihr Kreuzprodukt Dimension haben wird n(n-1)/2
. Ich überspringe die Idee der Differentialformen und möchte diese Idee in die Sprache der Templates in der C++ - Bibliothek einbringen. Ich hatte diese Idee:C++: Benutzerdefinierte Rückgabewert für verschiedene Arten von Template-Funktion (Methode)
auto Cross(const Vec<dim, float_t> &rhs) {
if (dim == 0)return;
if (dim == 1)return (float_t)0;
if (dim == 2)return Values[0] * rhs.Values[1] - Values[1] * rhs.Values[0];
if (dim == 3)return Vec<dim, float_t>(
Values[1] * rhs.Values[2] - Values[2] * rhs.Values[1],
Values[2] * rhs.Values[0] - Values[0] * rhs.Values[2],
Values[0] * rhs.Values[1] - Values[1] * rhs.Values[0]);
//...
}
aber leider auto
Spezifizierer nicht erlaubt für verschiedene Rückgabetypen. Ich könnte natürlich Chaos mit Vorprozessors, aber ich glaube, dass es mehr cleverer Weg, es zu tun, so etwas wie:
Vec<dim*(dim-1)/2,float_t> Cross(const Vec<dim,float_t> &rhs);
(mit void
als Sonderfall für nulldimensionalen Punkt und nur float_t
für eindimensionale Punkt). Wie kann man das auf intelligente Weise lösen?
Schreiben Sie überbelastete/Spezialisierungsfunktionen, die entweder einen 'const Vec <0, float_t> &' -Parameter oder einen 'const Vec &' -Parameter, etc ... Jeder überladen/specialized function wird einen geeigneten Rückgabetyp dafür haben. –
In C++ 17 können Sie dies mit 'if conexpr' machen, aber bis das verfügbar ist, müssen Sie Spezialisierungen wie in @ alfCs Antwort verwenden. –