Ich habe eine typische 'vector4' Klasse mit einem Operator float *, um es autocasting für gl * 4fv sowie []. Es gibt auch ‚const‘ Version für Optimierungen für den Compiler sowie const refrences, und das funktioniert gut:Rekursiver Typ Casting
typedef struct vec4
{
...
// ----------------------------------------------------------------- //
// Cast operator, for []
inline operator float*() {
return (float*)this;
}
// Const cast operator, for const []
inline operator const float*() const {
return (const float*)this;
}
// ----------------------------------------------------------------- //
...
// Vertex/Vector
struct {
float x, y, z, w;
};
// Color
struct {
float r, g, b, a;
};
} vec4;
Mein Problem ist, wenn ich ein ‚MATRIX4‘ Klasse jetzt codiert, mit Bedienungs vec4 *, die unterstützt Extrahieren von Zeilen aus der Matrix, und haben auch den "Nebeneffekt" der Matrix [] [] Operator, was nett ist.
typedef struct mat4
{
...
// ----------------------------------------------------------------- //
// Cast operator, for []
inline operator vec4*() {
return (vec4*)this;
}
// Const cast operator, for const []
inline operator const vec4*() const {
return (const vec4*)this;
}
// ----------------------------------------------------------------- //
private:
float f[16];
} mat4;
Meine Frage ist, warum nicht der Compiler erkennt die Fähigkeit, eine MAT4 zu konvertieren * zu schweben? Ich würde vermuten, dass das Erbe von mat4 -> vec4 -> float * vernünftig ist, aber es scheint nicht so. Es kam mir in den Sinn, dass der Compiler es als MAT4 sehen könnte -> vec4 * -> float *, die nicht definiert ist, aber diese Annahme war ungültig, da
den Bediener definiereninline operator const vec4() const {
return (vec4)*this;
}
nicht funktioniert, und Aufruf von glMultMatrixf (mat4 (...)); (Zum Beispiel) erzeugt die gleiche Fehlermeldung wie ohne den Operator.
definieren Operator float * in MAT4 ist natürlich unmöglich, denn das ist die Fähigkeit zu beseitigen [verwenden] [] (mehrdeutige Operatoren)
Irgendwelche Lösungen dafür? oder muss ich jedes Mal, wenn ich autocastieren möchte, manuell nach vec4 umwandeln? Auto-Casting ist ein wirklich nettes Feature und interpoliert den Code mit OpenGL sauber.
Das 'inline' Schlüsselwort wird nicht in Klassen-/Struct-Deklarationen benötigt. – n0rd
Wenn es eine Möglichkeit zur automatischen Konvertierung für Ihr Problem gäbe, hätten Sie bereits ein mehrdeutiges Operatorproblem mit [] [], als ob Sie in mat4 den Operator float * definiert hätten. –
GCC 4.3.x scheint keine Probleme zu haben, es verwendet operator [] für [] [] und operator const float * für die const float * akzeptierende Funktion. MSVC ist das Problem, also suche ich eine andere Problemumgehung. – LiraNuna